簡體   English   中英

JPQL (JPA) 查詢 SELECT DISTINCT ORDERED BY 遇到了一些問題

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

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