java - Criteria API 忽略 JOIN

标签 java sql jpa eclipselink inner-join

我有一个带有(内部)联接的简单条件 api 查询

public void find(Category category) {
 CriteriaBuilder b = getQueryBuilder();
 CriteriaQuery<Product> q = createQuery();
 Root<Product> root = q.from(Product.class);
 Join<Product, Category> myCategory= root.join("category");        
 q.where(b.equal(myCategory, category));
 entityManager.createQuery(q).getResultList();
}

查询有效,但如果我在 persistence.xml 中启用 sql 日志记录,我可以看到查询是一个

SELECT * FROM product, category WHERE ...

没有

SELECT * FROM product join category on category.id = product.category ...

知道这是什么原因吗? where 语句非常慢,因此真正的连接会更好。

我正在使用 eclipselink 2.5.1、Java EE7 和 postgres

我还有一个来自 Product 的父类(super class)

@Entity
@Audit
public class SuperClass {}

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Product extends SuperClass {}

但这应该没问题吧?

最佳答案

连接实际上正在执行,但是用于执行连接的 SQL 是用隐式连接表示法编写的。连接将具有与显式连接表示法(使用 JOIN 和 ON 的表示法)相同的性能。正在执行“真正的”连接,但它并不是您期望的显式连接表示法(又名 ANSI SQL 92)。

关于java - Criteria API 忽略 JOIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21513695/

相关文章:

java - H2 的 Hibernate Multi-Tenancy 问题 : wrong schema

java - 无法从类型 [java.lang.Object[]] 转换为类型

java - 如何使用对象创建 JavaFX 树

java - 无法访问java泛型类的方法

Mysql从多个表中获取数据

mysql - SQL 查询根据列值对表进行透视

java - Lob 使用 MySQL 和 jpa 返回 null

java - Anagram Checker 解决管测验

java - Keycloak.enabled = false - 返回状态 500 内部错误

mysql - 如何将字段的默认值设置为 '0000-00-00 00:00:00' ?