SELECT .... FROM Link l, Training t WHERE l.attribute = t.attribute;
Root<Link> rootLink = criteriaQuery.from(Link.class);
Root<Training> rootTraining = criteriaQuery.from(Training.class);
...
criteriaQuery.where(
criteriaBuilder.equal(rootLink.get(link_.linkAttribute), trainingLink));
6条答案
按热度按时间r1zhe5dt1#
第一:外键关系不仅仅是用来导航的。它们主要是用来确保关系中没有引入虚假的值。它们还可以帮助数据库进行查询优化。我建议您重新考虑这一点。
无论如何,要创建一个使用几个不相关实体的查询,需要将它们作为
from
(root
)实体放置(就像在SQL或JPQL中所做的那样)m1m5dgzv2#
从Hibernate 5.1开始,您可以在使用JPQL和HQL时连接不相关的实体:
但是,此功能在Criteria API中不可用,因为它需要API扩展。
解决方案
虽然您可以尝试使用两个
Root
对象并通过WHERE子句 predicate 模拟INNER JOIN,但生成的SQL不是解决此问题的最佳方法。您应该考虑使用jOOQ,因为除了能够以任何可能的方式连接表之外,如果将生成的SQL查询传递给JPA
createNativeQuery
方法,还可以获取实体。mrzz3bfm3#
最新的JPA规范(2.1)未涵盖不相关实体的连接
但是Hibernate 5.1.0+和EclipseLink 2.4.0+支持临时连接。http://blog.anthavio.net/2016/03/join-unrelated-entities-in-jpa.html
另一种可能是原生查询http://www.oracle.com/technetwork/articles/vasiliev-jpql-087123.html
odopli944#
您可以使用Blaze-persistence的JPA Criteria实现,它可以转换为JPQL/HQL,并提供该特性作为JPA Criteria API的扩展。
在自述文件中查找“Blaze-Persistence JPA-Criteria模块依赖项”:https://github.com/Blazebit/blaze-persistence/blob/master/README.md
然后使用
BlazeCriteriaBuilder cb = BlazeCriteria.get(criteriaBuilderFactory)
,最后使用blazeCriteriaQuery.getCriteriaBuilder(entityManager)
呈现JPA Criteria Query对象。xe55xuns5#
可以为连接查询创建视图,并为该视图创建实体,JpaRepository的使用与表的实体使用类似,如果需要动态构建where子句,也可以在视图实体之上构建
rsl1atfo6#
当遇到上述复杂情况时,最好使用好的JPQL/原生查询。一旦有人谈到连接或复合主键,条件查询往往会变得超级复杂和低效,所有JoinColumns,JoinTable,PrimaryKeyJoinColumn等的jpa实体Map也是如此。