Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JPA何时使用实体类型的路径而不是连接?_Jpa_Join - Fatal编程技术网

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

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_.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