我有以下实体和 pojo:
@Entity
public class TableA {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
long id;
string name;
}
@Entity
public class TableB {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
long id;
double price;
@ManyToOne
@JoinColumn(name = "tableAId")
TableA tableA;
//setters & getters
}
统计
public class Statistics {
long tableAId;
double price;
long count;
public Statistics(long tableAId, double price, long count) {
this.tableAId = tableAId;
this.price = price;
this.count = count;
}
//setters & getters
}
我想执行一个 jpql 查询来获取统计对象的结果列表,其中填充了 tableA 对象的引用 ID 以及 TableB 表中价格列和行数的总和。
我试过以下代码但没有成功:
Query query = em.createQuery("SELECT NEW se.exampel.Statistics"
+ "(b.tableAId, sum(price) ,count(b)) from TableB b ");
List<Statistics> statistics = query.getResultList();
异常
java.lang.IllegalArgumentException: org.hibernate.QueryException: 无法解析属性: tableAId 的: se.exampel.TableB [SELECT NEW se.exampel.Statistics(b.tableAId,count(b), sum(price)) 来自 se.exampel.TableB b ]
我做错了什么?
现在它是固定的: “从 tabelB p JOIN p.tabelA s GROUP BY s 中选择新的 se.exampel.Statistic(s.id, sum(p.price),count(p))”
最佳答案
您正在将 SQL 概念混合到 JPQL 中。查询需要我在实体 TableB 上进行,因此只能使用 TableB java 类中的映射属性。所以你需要使用类似的东西:
"SELECT NEW se.exampel.Statistics(b.tableA.id, sum(b.price) ,count(b)) from TableB b "
请注意,Hibernate 可能会执行从表 B 到表 A 的内部连接以获得 A 的 ID。如果你希望能够以JPA中立的方式直接访问TableB中的外键字段,你可能需要在TableB类中为其添加一个只读字段。有点像
@Column(name="tableA_ID", insertable=false, updatable=false);
long tableAId;
然后允许您在查询中访问 b.tableAId:
"SELECT NEW se.exampel.Statistics(b.tableAId, sum(b.price) ,count(b)) from TableB b "
并且应该避免表连接。
关于java - 在 jpql 查询中创建和填充 pojos 并作为列表获取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22196577/