[英]Got some troubles with JPQL (JPA) query SELECT DISTINCT ORDERED BY
如標題所示,我在 JPQL 中遇到了一些查詢問題
這就是我正在使用的查詢:
@Query(value = "SELECT DISTINCT o.idWhom FROM Message o WHERE o.idWho = ?1 ORDER BY o.date DESC")
List<Users> allCorrespondents(Users user);
班級留言:
public class Message {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@NotBlank
private String content;
@Temporal(TemporalType.TIMESTAMP)
private Date date = new Date();
boolean read = false;
@ManyToOne
@JoinColumn(name = "id_who")
private Users idWho;
@ManyToOne
@JoinColumn(name = "id_whom")
private Users idWhom;
}
我遇到的錯誤:
2022-06-17 13:02:22.435 ERROR 2304 --- [nio-8080-exec-2] c.e.h.S.CustomAuthorizationFilter :
Error logging in: Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessResourceUsageException: could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet
雖然我無法通過問題單證明這一點,但我已經做了足夠的調查,相信這個問題發生在從 5 開始的休眠版本上。(例如休眠 4 !)使用數據庫Oracle 。
問題似乎如下:
當您編寫 JPQL 查詢SELECT DISTINCT o.idWhom FROM Message o
時,您會期望在執行 SQL 查詢后實體將被過濾為不同的,其中映射器將過濾掉不同的實體。
但是由於某種原因,在我上面提到的那些版本中,實際發生的是在 SQL 查詢中傳遞了 distinct ,實際執行的內容如下:
SELECT DISTINCT idh.id_column FROM O_TABLE o JOIN IDWHOM_TABLE idh on (o.id_foreign_key_column = idh.id_column
如您所見,此選擇查詢不會在結果集中返回映射器構建實體所需的所有列,而僅返回 id 列。 因此,映射器無法從 ResultSet 中提取構建實體所需的所有列,並且您會收到could not extract ResultSet
的錯誤。
我發現的一種解決方法是,當 distinct 放置在某個原始字段而不是實體上時,它能夠工作,因此您可以利用它來利用以下方法繞過此問題:
這假設實體Users
有一個名為id
。
@Query(value = "SELECT us FROM Users us where us.id in (SELECT DISTINCT o.idWhom.id FROM Message o WHERE o.idWho = ?1)")
List<Users> allCorrespondents(Users user);
我已經排除了您在原始查詢中的排序,因為即使從邏輯角度來看似乎也是錯誤的。 一個用戶實體可以有多個消息。 您如何僅從消息的創建日期訂購返回的用戶? 該字段不能對用戶自己進行排序。 它只能用於訂購消息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.