簡體   English   中英

在jpql查詢中創建並填充pojos並獲取列表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM