JPA何时使用实体类型的路径而不是连接?
JPA规范中的一个示例:JPA何时使用实体类型的路径而不是连接?,jpa,join,Jpa,Join,JPA规范中的一个示例: CriteriaQuery<Customer> q = cb.createQuery(Customer.class); Root<Customer> customer = q.from(Customer.class); Join<Customer, Order> order = customer.join(Customer_.orders); q.where(cb.equal(cb.treat(order.get(Order_.pro
CriteriaQuery<Customer> q = cb.createQuery(Customer.class);
Root<Customer> customer = q.from(Customer.class);
Join<Customer, Order> order = customer.join(Customer_.orders);
q.where(cb.equal(cb.treat(order.get(Order_.product), Book.class)
.get(Book_.name),
"Iliad"));
q.select(customer);
当转换为SQL时,它实际上是一个表连接吗
是的
在这个例子中,path和join之间的区别是什么
Order Product
---------- -------------
productId id name
让我解释一下使用JPQL,它会更清晰。您的代码大致相当于:
SELECT c FROM Customer c
JOIN c.orders o
WHERE o.product.name = 'Illiad'
SELECT c FROM Customer c
JOIN c.orders o
JOIN o.product p
WHERE p.name = 'Illiad'
单值关联可以通过隐式联接(使用路径导航)和显式联接(使用JOIN
)进行查询。请务必记住,默认情况下隐式连接是内部连接。因此,上述查询相当于:
SELECT c FROM Customer c
JOIN c.orders o
WHERE o.product.name = 'Illiad'
SELECT c FROM Customer c
JOIN c.orders o
JOIN o.product p
WHERE p.name = 'Illiad'
此语法更详细,但允许您在需要时指定联接类型
多值关联的行为稍有不同。以下查询:
SELECT c FROM Customer c
JOIN c.orders.product.name = 'Illiad'
不会编译。此处不能使用速记语法,因为c.orders
表示集合作为一个整体,而不是其单个元素。要引用单个元素,我们需要取消对集合的引用,这使得JOIN c.orders o
语法是必需的(别名o
现在引用c.orders
中的单个元素)
另一方面,当作为一个整体引用多值关联时,不需要显式联接,例如:
SELECT c FROM Customer c
WHERE SIZE(c.orders) > 5
SELECT c.orders FROM Customer c