【发布时间】: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;
我该怎么做?
我通常会创建一个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();
}
【问题讨论】:
-
想告诉我们什么是“DetachedCriteria”和“Projection”?它们不是 JPA 类。如果使用 JPQL,那么您将不得不告诉人们您拥有哪些实体/字段,因为那里的表格无关紧要。
-
为什么不直接运行 SQL 语句呢?您的解决方案在问题的开头
-
@LukasEder 目前,在我们的系统中,我们确实使用仅 SQL 语句来呈现存储在 DB 中的数据列表(仅供查看)。我正在研究使用纯 Java 的可能性,而无需编写查询。上面的例子只是我们通常遇到的一个非常少见的例子。
标签: java sql hibernate jpa hibernate-mapping