我有 2 個物體:具有一對多關系的傳單和頁面(每個傳單有很多頁)
@Entity
Leaflet {
@Id
@GeneratedValue
private UUID leafletId;
private Integer noPages;
@OneToMany(mappedBy = "leaflet", cascade = CascadeType.ALL, orphanRemoval = true)
Set<Page> pages = new HashSet<>();
}
@Entity
Page {
@Id
@GeneratedValue
private UUID pageId;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "leaflet_id")
private Leaflet leaflet;
@Enumerated
private PageStatus status = PageStatus.CREATED;
}
和狀態列舉
public enum PageStatus {
CREATED,
FRAMED
}
我想撰寫單個查詢來回傳給定傳單的所有頁面是否都已經裝幀。所以我寫了這個
@Repository
public interface PageRepository extends JpaRepository<Page, UUID> {
@Query("SELECT case when (COUNT(p) = l.noPages) then true else false end from Page p inner join Leaflet l on p.leaflet.leafletId = l.leafletId where p.status = 1 and l.leafletId = ?1")
boolean allPagesFramed(UUID leafletId);
}
但是錯誤來了,這意味著我不能直接使用 l.noPages
錯誤:列“leaflet1_.no_pages”必須出現在 GROUP BY 子句中或用于聚合函式 org.hibernate.exception.SQLGrammarException:無法提取 ResultSet
有沒有辦法讓它成為 1 查詢?當然,我可以先選擇 l.noPages 并首先點擊 DB,然后將此值注入到上面的查詢(而不是連接)中,我現在正在做的解決方法是。
uj5u.com熱心網友回復:
您可以根據頁表執行此操作。使用 nativeQuery = true
@Query(value = "select case when ( count(*) > 0 ) then false else true end "
"from page p "
"where p.leaflet_id = ?1 and p.status <> 1 ", nativeQuery = true)
boolean allPagesFramed(UUID leafletId);
如果一個頁面至少有一個不同于 1 (FRAMED) 的狀態,則查詢回傳 false,并非所有頁面都是 FRAMED。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/432640.html
