我有以下需要转换为 JPA 规范的 sql:
select
* from TableA a
cross join TableB b
cross join (
select distinct refAId from TableC c where c.name like 'Your_NAME'
) as T
where
T.refAId = a.id
我怎样才能在实体方面形成交叉连接 T 到根 TableA ? 所以基本上在规范实现中,我将 CriteriaBuilder 作为根根,CriteriaQuery> cq,CriteriaBuilder cb。现在我应该如何继续将根映射到上面提到的查询定义的表 T?
上面的查询比下面的更高效:
select
* from TableA a
cross join TableB b
where
a.id in (
select refAId from TableC c where c.name like 'Your_NAME'
)
为什么它更有效,因为像“Your_NAME”这样的扫描 c.name 在第一个查询中只发生一次。
答案 0 :(得分:0)
查询可以用以下方式重写:
SELECT *
FROM TableA a, TableB b, TableC c
WHERE c.name LIKE 'Your_NAME'
AND c.refAId = a.id
Criteria 查询变为:
var tableA = cq.from(TableA.class);
var tableB = cq.from(TableB.class);
var tableC = cq.from(TableC.class);
cq.where(cb.and(
cb.equal(tableA_.id, tableC_.refAId),
cb.equal(tableC_.name, "YOUR_NAME")
));
cq.multiselect(...);
不过,TableA
和 TableC
实体之间是否没有关联?如果有,你可以简单地做:
var tableC = cq.from(TableC.class);
var tableB = cq.from(TableB.class);
var tableA = tableC.join(TableC_.refA);
...