我有一个带有(内部)联接的简单条件 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/