JPA 2个标准API:如何选择不同的连接表值,而无需使用元模型?(JPA 2 criteria A

2019-10-17 09:33发布

我有查询的以下类型,我想转换成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具有许多程序和各程序具有proceedingstatus。

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);

现在它选择项,这些地方有根据,如果在任何一个的程序中的“时间戳”时谓我建立相匹配的条件谓词的权利proceedingsstatus至少出现1次。 因此,它也将选择一个条目的时候C.timestamp是在d错textValue的诉讼正确,是否有属于与D.正确textvalue至少一个条目C

我怎样才能改变它,让它只选择是在proceedingsstatus拥有权的价值与收益的时间是正确的?

Answer 1:

重用连接,而不是创建每个断言新的。

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


文章来源: JPA 2 criteria API: How to select values from various joined tables without using Metamodel?