考虑以下JPQL查询:如何正确地将JPQL“join fetch”与“where”子句一起表示为JPA 2 CriteriaQuery?
SELECT foo FROM Foo foo
INNER JOIN FETCH foo.bar bar
WHERE bar.baz = :baz
我想翻译成Critieria查询此。这是据我已经得到了:
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Foo> cq = cb.createQuery(Foo.class);
Root<Foo> r = cq.from(Foo.class);
Fetch<Foo, Bar> fetch = r.fetch(Foo_.bar, JoinType.INNER);
Join<Foo, Bar> join = r.join(Foo_.bar, JoinType.INNER);
cq.where(cb.equal(join.get(Bar_.baz), value);
这里的明显的问题是,我做同样加入两次,因为Fetch<Foo, Bar>
似乎并不有一个方法来获得一个Path
。 有没有办法避免必须加入两次?或者我必须坚持使用旧的JPQL,查询就像这么简单?
嗯,谢谢,但我宁愿坚持使用标准的API,并尽量避免额外的第三方库。如果我想要做的事对JPA Criteria API来说是不可能的,那么我可能会坚持使用普通的JPQL。 – chris 2011-04-28 09:40:05
你解决了你的问题吗?我有同样的问题。 Fetch无法投射到Join,并且我无法从Fetch获取路径。它几乎不可用。唯一的解决办法是有两个相同的连接,这是不可接受的。 – svlada 2015-04-22 07:17:16
好吧,詹姆斯的回答很好地描述了问题的根源。你不能这样做,这是一个健全的设计决策。如果我没有记错的话,我最终加入了两次。这就是说,如果我有选择,我将永远不会再使用JPA,因为我认为这是一个无用的抽象层,在阉割底层实现时会增加不必要的复杂性。 – chris 2015-04-22 12:22:26