2017-08-01 71 views
1

我有一个实体Order与选项列表内的列表中,这样的:春季启动JPA:搜索按领域实体表示嵌入对象

@Entity 
@Table(name = "orders") 
public class OrderEntity extends AuditableEntity { 
    private Long passengerId; 
    private OrderType type; 
    private OrderStatus status; 
    @ElementCollection() 
    @CollectionTable(name = "options", joinColumns = @JoinColumn(name = "order_id")) 
    private List<OrderOptionEntity> options = new ArrayList<>(0); 
... 

而且我想找到所有的订单,匹配指定列表选项。我正在使用JpaRepository<OrderEntity, Long>进行CRUD操作。不幸的是,当我添加方法findByOptions,像这样:

public interface OrderRepository extends JpaRepository<OrderEntity, Long> { 
    List<OrderEntity> findAllByOptions(List<OrderOptionEntity> options); 
} 

在测试中,它抛出

SqlNode的文本并没有提及预期的列数;

所以,现在我只是做findAll()并手动过滤所有订单。有没有更优雅的获取实体的方式,通过内部列表中的所有元素进行匹配?

UPDATE: 当我运行

@Query("SELECT ord FROM OrderEntity ord WHERE :options MEMBER OF ord.options") 
    List<OrderEntity> findAllByOptions(@Param(value = "options") List<OrderOptionEntity> options); 

它工作正常,但前提是ord.options和期权中查询有大小为1,如果有更多的 - 它抛出

ohengine .jdbc.spi.SqlExceptionHelper:JDBC中的参数无效 调用:参数索引超出范围:3

生成的SQL

/* SELECT 
     ord 
    FROM 
     OrderEntity ord 
    WHERE 
     :options MEMBER OF ord.options */ select 
      orderentit0_.id as id1_3_, 
      orderentit0_.version as version2_3_, 
      orderentit0_.create_time as create_t3_3_, 
      orderentit0_.update_time as update_t4_3_, 
      orderentit0_.comment as comment5_3_, 
      orderentit0_.distance_to_order as distance6_3_, 
      orderentit0_.passenger_id as passenge7_3_, 
      orderentit0_.price as price8_3_, 
      orderentit0_.route_distance as route_di9_3_, 
      orderentit0_.status as status10_3_, 
      orderentit0_.type as type11_3_ 
     from 
      orders orderentit0_ 
     where 
      (
       ? , ? 
      ) in (
       select 
        options1_.key, 
        options1_.value 
       from 
        options options1_ 
       where 
        orderentit0_.id=options1_.order_id 
      ) 

所有我想要的东西 - 让所有订单,包含的选项的一些子集。

+0

Yuo可以获得OrderEntity表单OrderOptionEntity。这会工作吗? –

回答

2

您可能在您的查询方法中忘记了In关键字。

试试这个

public interface OrderRepository extends JpaRepository<OrderEntity, Long> { 

    List<OrderEntity> findAllByOptionsIn(List<OrderOptionEntity> options); 

} 

看一看的docs

+0

谢谢,我读过。但它会抛出相同的异常: org.springframework.orm.jpa.JpaSystemException:SqlNode的文本未引用预期的列数;嵌套的异常是org.hibernate.HibernateException:SqlNode的文本没有引用预期的列数 –

+0

您加入的列是正确的'joinColumns = @JoinColumn(name =“order_id”)'? –

+0

您可以调试代码并发布运行的查询?! –