我有一个实体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
)
所有我想要的 - 获取所有订单,包含一些选项子集。
答案 0 :(得分:2)
您可能忘记了查询方法中的In
关键字。
试试这个
public interface OrderRepository extends JpaRepository<OrderEntity, Long> {
List<OrderEntity> findAllByOptionsIn(List<OrderOptionEntity> options);
}
查看docs
。