JPA 2标准API:如何在不使用Metamodel的情况下从各种连接表中选择值?

时间:2012-11-07 13:33:57

标签: java jpa-2.0 criteria-api

我有以下类型的查询,我希望将其转换为jpa条件查询和下表结构:

Table A 1-->1 Table B  1<--* Table C (proceedings) *-->1 Table D(prcoeedingsstatus)
--------      --------       -------                     -------
 aID           bID           cID                         dID
 ...           ....          timestamp                   textValue
 f_bID         ....          f_bID       
                             f_dID

1 A有1 B,1 B有很多程序,每个程序都有一个程序状态。

SELECT a.*

FROM ((a LEFT JOIN b ON a.f_b = b.id)
        LEFT JOIN proceedings ON b.id = proceedings.f_b)
        RIGHT JOIN proceedingsstatus ON proceedings.f_d = proceedingsstatus.id

WHERE   d.textValue IN ("some unique text")
        AND c.timestamp BETWEEN 'somedate' AND 'anotherdate'

当我现在尝试为谓词做这样的事情时:

Predicate conditions = (root.join("tableB")
                            .joinList("proceedings")
                            .join("proceedingsstatus").get("textValue"))
                            .in(constraintList.getSelectedValues());

Predicate time = cb.between((root.join("tableB")
                            .joinList("proceedings")
                            .<Date>get("timestamp")), dt1.toDate(), dt2.toDate());

constraints = cb.and(conditions, time);

现在它根据条件 - 谓词选择条目A,其中至少有一次出现右诉讼状态,如果在A的任何一个程序中,'timestamp'与我建立的时间谓词匹配。 因此,如果至少有一个属于A的条目C在D中具有正确的文本值,那么当C.timestamp对于D中的错误textValue进行正确时,它也会选择条目A.

如何更改它以便它只选择会员资格具有正确价值且收益时间正确的A?

1 个答案:

答案 0 :(得分:1)

重用连接,而不是为每个谓词创建新连接。

Join proceedings = root.join("tableB").joinList("proceedings");