簡體   English   中英

Spring-Data-Jpa:帶有子查詢的 INNER JOIN

[英]Spring-Data-Jpa: INNER JOIN with Subquery


我有以下問題。 我想在我的 Spring Boot 項目中執行這個查詢。 我嘗試使用 JPA 存儲庫界面中的查詢注釋來做到這一點。 但是它在內部聯接中說“意外的選擇”。 當我直接在 mySQL 數據庫上執行此查詢時,它將起作用。

有沒有人對這種情況有解決方案?

這是我的查詢:

SELECT t1.*
FROM az_manager t1
INNER JOIN
(
    SELECT maID, MAX(datum) AS max_date
    FROM az_manager
    WHERE maID IN (7243, 1)
    GROUP BY maID
) t2
   ON t1.maID = t2.maID AND t1.datum = t2.max_date
WHERE
    t1.maID IN (7243, 1);

這是我的課:

@Entity
@Table(name = "az_manager")
@IdClass(TnsWorkingHoursManagerId.class)
@Getter
@Setter
public class TnsWorkingHoursManager extends TnsObject{

    @Id
    @Column(name = "datum")
    private long date;

    @Id
    @Column(name = "maid")
    private int employeeId;

    @Column(name = "typid")
    private int typeId;

    @Column(name = "bemerkung")
    private String comment;

    @Column(name = "host")
    private String host;

    @Column(name = "modus")
    private byte mode;

    public TnsWorkingHoursManager() {
    }

}

這是我對 JPA 存儲庫的嘗試:

@Query(value = "SELECT azm1 FROM az_manager azm1 INNER JOIN (SELECT maID, MAX(datum) AS max_date FROM az_manager WHERE maID IN(:userIds) GROUP BY maID) azm2 ON azm1.maID = azm2.maID AND azm1.datum = azm2.max_date WHERE azm1.maID IN (:userIds)")
    List<TnsWorkingHoursManager> getLastEntries(@Param("userIds") ArrayList<Integer> userIds);

在第二個選擇它說“'SELECT'意外”

對於可能偶然發現這個問題的其他人:

如果沒有在 Spring Repository 中的@Query注解中添加nativeQuery = true參數,則查詢將被認為是用 JPQL 編寫的。

來自 JPQL 文檔

子查詢可以用在 WHERE 或 HAVING 子句中。

根據上面的引用,JPQL(Java 持久性查詢語言)不支持 FROM 子句中的子查詢,這就是為什么 OP 必須使查詢本地化才能使其工作。

我找到了解決辦法。 我忘了在行尾添加“, nativeQuery = true”,但在括號中。 現在它起作用了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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