java - JPA/JPQL JOIN 子选择/子查询

标签 java jpa join subquery jpql

我无法将一些简单的 SQL 语句转换为 JPQL,因为使用了 JPQL 不支持的子查询。

谁能给我一个提示,如何使用 JPQL 或 JPA2 Criteria API 获得相同的结果?

给定(简化的假数据来证明问题):

CREATE TABLE person (id integer, name text);
CREATE TABLE phone (id integer, person_id integer, type text, number text);

INSERT INTO person VALUES (1, "John");
INSERT INTO person VALUES (2, "Mike");
INSERT INTO person VALUES (3, "Paul");
INSERT INTO person VALUES (4, "Walter");

INSERT INTO phone VALUES (1, 1, "MOBILE", "+49-123-11111");
INSERT INTO phone VALUES (2, 1, "HOME"  , "+49-123-22222");
INSERT INTO phone VALUES (3, 2, "WORK"  , "+49-123-33333");
INSERT INTO phone VALUES (4, 4, "MOBILE", "+49-123-44444");

-- Select all from person and their mobile number if possible
-- This query has to be translated to JPQL

SELECT person.name, mobile.number FROM person LEFT JOIN (
  SELECT * FROM phone WHERE type = "MOBILE"
) AS mobile ON person.id = mobile.person_id;

预期结果:

| name   | number        |
|--------|---------------|
| John   | +49-123-11111 |
| Mike   |               |
| Paul   |               |
| Walter | +49-123-44444 |

Java:

class Person {
    String name;
    List<Phone> phones;
}

class Phone {
    String type;
    String number;
}

JPQL(没有按预期工作 :-( ):

SELECT person.name, phone.number FROM Person person
    LEFT JOIN person.phones AS phone
    WHERE phone.type = "MOBILE"

最佳答案

SELECT person.name, phone.number 
   FROM Person AS person LEFT JOIN person.phones AS phone 
   ON phone.type = 'MOBILE'

您还可以将 ON 关键字替换为 hibernate 特定的 WITH:

SELECT person.name, phone.number 
   FROM Person AS person LEFT JOIN person.phones AS phone 
   WITH phone.type = 'MOBILE'

关于java - JPA/JPQL JOIN 子选择/子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31393246/

相关文章:

java - 404-运行时未找到-spring-boot-rest-api

java - 如何使用接口(interface)和 JPA

php - 如何在 PHP 和 MySQL 中一次从 2 个表中获取信息?

sql - 考虑可扩展性时,为什么连接不好?

mysql - 未知列,即使该列存在

java - Java 开发人员学习 C++ 的最佳方法是什么

java - 为什么在 spring 3.1 和 hibernate 4 中找不到当前线程异常的这个 No Session

java - 如何使用 for 循环在 JLabel 中显示更改的文本

xml - org.xml.sax.SAXParseExceptionpublicId : http://xmlns. jcp.org/xml/ns/persistence/persistence_2_1.xsd

java - JPA - 字段的列数必须与引用的主键相同