Spring boot JPA:按字段搜索实体,表示嵌入对象列表

时间:2017-08-01 07:16:48

标签: spring spring-data-jpa jpql

我有一个实体Order,其中包含选项列表,如下所示:

@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()并手动过滤所有订单。有没有更优雅的方式来获取实体,匹配里面列表的所有元素呢?

更新: 我跑的时候

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

它工作正常,但只有当查询中的ord.options和选项的大小为1时,如果更多 - 它会抛出

  

o.h.engine.jdbc.spi.SqlExceptionHelper:JDBC中的参数无效   call:参数索引超出范围: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
            )

所有我想要的 - 获取所有订单,包含一些选项子集。

1 个答案:

答案 0 :(得分:2)

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

试试这个

public interface OrderRepository extends JpaRepository<OrderEntity, Long> {

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

}

查看docs