JPA 休眠规范

时间:2021-03-10 13:25:49

标签: hibernate jpa

我有以下需要转换为 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 在第一个查询中只发生一次。

1 个答案:

答案 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(...);

不过,TableATableC 实体之间是否没有关联?如果有,你可以简单地做:

var tableC = cq.from(TableC.class);
var tableB = cq.from(TableB.class);
var tableA = tableC.join(TableC_.refA);
...