如何添加子选择以进行选择

Dav*_*vid 2 java sql hibernate jpa hibernate-mapping

我想执行这样的查询:

SELECT Table1.COL1,
       Table1.COL2,
       (SELECT SUM(Table2.COL3)
          FROM Table2
         WHERE Table2.UID = Table1.UID) SUMOF
  FROM Table1;
Run Code Online (Sandbox Code Playgroud)

我该怎么做?我通常创建一个Criteria添加,只ProjectionList填充. 我创建了一个来计算... COL1COL2
DetachedCriteriasum

现在,如何将这个分离的标准附加到主要标准?我的直觉说 - 这是某种需要添加到列表中的Projection,但我不知道如何.此外,不确定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")
  )
;
Run Code Online (Sandbox Code Playgroud)

实体(非常短的版本)

@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();
}
Run Code Online (Sandbox Code Playgroud)

Vla*_*cea 5

对于相关子查询(如上所示),您可以使用@Formula,它可以进行任意SQL查询.然后,您需要获取实体并执行子查询.

但是,如果您只需要针对单个业务需求的查询,则本机SQL会更加优雅.

至于派生表查询(例如,从select中选择),JPA和Hibernate都不支持派生表查询.

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

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