我有一個實體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
)
所有我想要的東西 - 讓所有訂單,包含的選項的一些子集。
Yuo可以獲得OrderEntity表單OrderOptionEntity。這會工作嗎? –