【问题标题】:Is there any approach to make Join with JPA2 criteria API like this?有什么方法可以像这样使用 JPA2 标准 API 进行加入吗?
【发布时间】:2014-05-28 10:59:04
【问题描述】:

我在使用 JPA2 标准 API 时遇到了麻烦。有没有什么方法可以用 JPA2 标准 API 来做这样的事情:

SELECT t1.id FROM Table1 t1 INNER JOIN Table2 t2 ON (t1.id = t2.id)

使用这些规则:

  1. table1没有table2引用
  2. table2 有 table1 引用
  3. 结果应该是 table1 ids

我对 JPA2 标准 API Root 感到困惑。在这种情况下如何创建连接?我应该使用两个 ROOT:一个用于 JOIN,另一个用于 SELECT?请回复

【问题讨论】:

    标签: java sql jpa criteria


    【解决方案1】:

    使用位置 你可以做一个通常的 JPQL 跨产品连接:

    SELECT t1.id FROM Table1 t1, Table2 t2 WHERE t2.t1_id = t1.id
    

    JPA 对右连接的支持 JPA 不支持右连接查询。来自here

    右外连接和右外提取连接不需要 Java Persistence 2.0 中支持。使用 RIGHT 连接的应用程序 类型将不可移植。

    原生 SQL 查询 所以另一种选择是使用原生 SQL 查询。

    SELECT Table1.id FROM Table1, Table2 WHERE Table2.t1_id = Table1.id
    

    【讨论】:

    • 在 SQL 原生中,所有 sql 语句都有效;包括 UNION。
    • 顺便说一句,在本机 SQL 查询中:表是来自 DB 的真实表名和字段,或者它是 java 中的实体及其字段?
    • 我更新了原生的sql查询,更清晰了;这些是表名
    【解决方案2】:

    JPQL 查询只是

    select e1.id from Entity2 e2 join e2.entity1 e1
    

    使用条件 API,它看起来像这样(未经测试。我讨厌这个 API):

    CriteriaQuery<String> cq = cb.createQuery(Long.class);
    Root<Entity2> e2 = cq.from(Entity2.class);
    cq.select(e2.get(Entity2_.entity1).get(Entity1_.id));
    

    【讨论】:

    • 所以使用 JPQL 更简单……API 呢?
    • 它支持UNION吗?
    • JPQL 不支持联合。 “API”是什么意思? JPA2 标准 API?您必须翻译以上内容。但是这个 API 非常繁琐,并且产生了难以维护的代码。为什么要使用它而不是简单的 JPQL?
    • 我需要对每个请求进行 2 次选择查询(这比对 DB 进行 2 次调用更有效)。所以我在考虑联合。它在普通 SQL 中运行良好。总而言之,我在同一实体上有 2 个案例。这些案例充满了很多连接,但在这两种情况下,选定的字段是相同的。
    • JPA 不支持联合。故事结局。因此,如果您想要联合,请使用本机查询。
    猜你喜欢
    • 2012-02-14
    • 2019-08-22
    • 1970-01-01
    • 2012-10-31
    • 2023-01-10
    • 1970-01-01
    • 1970-01-01
    • 2012-09-08
    • 1970-01-01
    相关资源
    最近更新 更多