java 如何使用JPA标准API连接不相关的实体

eanckbw9  于 2023-01-07  发布在  Java
关注(0)|答案(6)|浏览(180)

两个数据库表具有外键关系。
JPA将它们Map到两个实体AB,但是连接列被手动从实体中删除,因此在JPA世界类中AB不相关,您不能通过字段/属性从一个导航到另一个。
使用JPA Criteria API,是否可以创建一个连接这两个表的查询?
我在互联网上找到的所有例子都使用连接列来实现目标,但是,如上所述,它被从代码中删除了,因为大多数时候我对AB之间的关系不感兴趣,而且我担心可能的开销。

r1zhe5dt

r1zhe5dt1#

第一:外键关系不仅仅是用来导航的。它们主要是用来确保关系中没有引入虚假的值。它们还可以帮助数据库进行查询优化。我建议您重新考虑这一点。
无论如何,要创建一个使用几个不相关实体的查询,需要将它们作为fromroot)实体放置(就像在SQL或JPQL中所做的那样)

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

m1m5dgzv2#

从Hibernate 5.1开始,您可以在使用JPQL和HQL时连接不相关的实体:

Tuple postViewCount = entityManager.createQuery(
    "select p as post, count(pv) as page_views " +
    "from Post p " +
    "left join PageView pv on p.slug = pv.slug " +
    "where p.title = :title " +
    "group by p", Tuple.class)
.setParameter("title", "Presentations")
.getSingleResult();

但是,此功能在Criteria API中不可用,因为它需要API扩展。

解决方案

虽然您可以尝试使用两个Root对象并通过WHERE子句 predicate 模拟INNER JOIN,但生成的SQL不是解决此问题的最佳方法。
您应该考虑使用jOOQ,因为除了能够以任何可能的方式连接表之外,如果将生成的SQL查询传递给JPAcreateNativeQuery方法,还可以获取实体。

mrzz3bfm

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

odopli94

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对象。

xe55xuns

xe55xuns5#

可以为连接查询创建视图,并为该视图创建实体,JpaRepository的使用与表的实体使用类似,如果需要动态构建where子句,也可以在视图实体之上构建

rsl1atfo

rsl1atfo6#

当遇到上述复杂情况时,最好使用好的JPQL/原生查询。一旦有人谈到连接或复合主键,条件查询往往会变得超级复杂和低效,所有JoinColumns,JoinTable,PrimaryKeyJoinColumn等的jpa实体Map也是如此。

相关问题