【问题标题】:How to add sub-select to select如何添加子选择来选择
【发布时间】:2023-03-07 05:05:01
【问题描述】:

我想执行这样的查询:

SELECT Table1.COL1,
       Table1.COL2,
       (SELECT SUM(Table2.COL3)
          FROM Table2
         WHERE Table2.UID = Table1.UID) SUMOF
  FROM Table1;

我该怎么做? 我通常会创建一个CriteriaProjectionList 添加到其中,仅填充COL1COL2
我创建了一个DetachedCriteria 来计算sum...

现在,如何将这个分离的标准附加到主要标准?我的直觉说 - 这是某种需要添加到列表中的投影,但我不知道如何。另外,不确定WHERE Table2.COL4 = Table1.COL5 的分离条件将如何工作。

另外,我确信这个查询可能会以不同的方式编写,例如使用 join 语句。如果有办法像这样运行它仍然很有趣。

DetachedCriteria 和主要Criteria

DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Table2.class, "table2");
detachedCriteria
  .setProjection(
    Projections.projectionList()
      .add(Projections.sum("table2.col3"), "sumCol3")
  )
  .add(Restrictions.eq("table2.uid", "table1.uid"))
;

Criteria criteria = session.createCriteria(Table1.class, "Table1");
criteria
  .setProjection(
    Projections.projectionList()
      .add(Projections.property("Table1.col1"), "col1")
      .add(Projections.property("Table1.col2"), "col2")
  )
;

实体(非常短的版本)

@Entity
@Table(name = "Table1")
public class Table1 {
  @Id
  @Column(name = "uid")
  public String getUid();

  @Column(name = "col1")
  public String getCol1();

  @Column(name = "col2")
  public String getCol2();

  @Column(name = "col3")
  public String getCol3();

  @Column(name = "col4")
  public String getCol4();

  @Column(name = "col5")
  public String getCol5();
}

@Entity
@Table(name = "Table2")
public class Table2 {

  @Id
  @Column(name = "uid")
  public String getUid();

  @Column(name = "col3")
  public BigDecimal getCol3();

  @Column(name = "col4")
  public String getCol4();

  @Column(name = "col5")
  public String getCol5();
}

【问题讨论】:

  • 想告诉我们什么是“DetachedCriteria”和“Projection”?它们不是 JPA 类。如果使用 JPQL,那么您将不得不告诉人们您拥有哪些实体/字段,因为那里的表格无关紧要。
  • 为什么不直接运行 SQL 语句呢?您的解决方案在问题的开头
  • @LukasEder 目前,在我们的系统中,我们确实使用仅 SQL 语句来呈现存储在 DB 中的数据列表(仅供查看)。我正在研究使用纯 Java 的可能性,而无需编写查询。上面的例子只是我们通常遇到的一个非常少见的例子。

标签: java sql hibernate jpa hibernate-mapping


【解决方案1】:

对于相关子查询(如您在上面介绍的那个),您可以使用@Formula,它可以接受任意 SQL 查询。然后,您需要获取实体并执行子查询。

但是,如果您只需要此查询来满足单个业务需求,则原生 SQL 会更优雅。

对于派生表查询(例如从 select 中选择),JPA 和 Hibernate 都不支持派生表查询,这是有充分理由的。

实体查询 (JPQL pr Criteria) 旨在获取您计划修改的实体。

对于派生表投影,本机 SQL 是可行的方法。否则,您为什么认为 EntityManager 提供了 createNativeQuery 方法?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-13
    • 1970-01-01
    • 2023-03-10
    • 2021-04-19
    • 2015-07-04
    • 2014-06-07
    • 1970-01-01
    相关资源
    最近更新 更多