如何将 select 添加到 select
How to add sub-select to select
我想执行这样的查询:
SELECT Table1.COL1,
Table1.COL2,
(SELECT SUM(Table2.COL3)
FROM Table2
WHERE Table2.UID = Table1.UID) SUMOF
FROM Table1;
我该怎么做?
我通常创建一个 Criteria
添加 ProjectionList
到它,只填充 COL1
和 COL2
。
我创建了一个 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();
}
对于相关子查询(如您上面介绍的子查询),您可以使用 @Formula,它可以进行任意 SQL 查询。然后,您需要获取实体并执行子查询。
但是,如果您只需要此查询来满足单个业务需求,则原生 SQL 会更优雅。
至于派生的 table 查询(例如 select 来自 select),JPA 和 Hibernate 都不支持派生的 table 查询是有充分理由的。
实体查询 (JPQL pr Criteria) 用于获取您计划修改的实体。
对于派生的 table 投影,原生 SQL 是可行的方法。否则,您认为 EntityManager 为何提供 createNativeQuery 方法?
我想执行这样的查询:
SELECT Table1.COL1,
Table1.COL2,
(SELECT SUM(Table2.COL3)
FROM Table2
WHERE Table2.UID = Table1.UID) SUMOF
FROM Table1;
我该怎么做?
我通常创建一个 Criteria
添加 ProjectionList
到它,只填充 COL1
和 COL2
。
我创建了一个 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();
}
对于相关子查询(如您上面介绍的子查询),您可以使用 @Formula,它可以进行任意 SQL 查询。然后,您需要获取实体并执行子查询。
但是,如果您只需要此查询来满足单个业务需求,则原生 SQL 会更优雅。
至于派生的 table 查询(例如 select 来自 select),JPA 和 Hibernate 都不支持派生的 table 查询是有充分理由的。
实体查询 (JPQL pr Criteria) 用于获取您计划修改的实体。
对于派生的 table 投影,原生 SQL 是可行的方法。否则,您认为 EntityManager 为何提供 createNativeQuery 方法?