[英]create and populate pojos in jpql query and get as list
我有以下實體和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 [從se中選擇新的se.exampel.Statistics(b.tableAId,count(b),sum(price)) .exampel.TableB b]
我究竟做錯了什么?
現在它已修復:“從tabelB p JOIN p.tabelA s GROUP BY中選擇新的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可能會執行從tableB到tableA的內部聯接以獲得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 "
並且應該避免表聯接。
查詢應包含b.tableA
屬性名稱而不是列名稱tableAId
更新:參考@Chris查詢中的評論應該是
SELECT NEW se.exampel.Statistics(b.tableA.id,sum(b.price),count(b)) from TableB b
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.