簡體   English   中英

如何在彈簧數據jpa規范中將枚舉作為字符串處理

[英]How to handle Enums as string in spring data jpa Specification

嘗試在數據庫級別使用過濾器數據規范 我有一個實體與另一個實體作為實例,其中實例變量類包含一個Emun字段。 這默認為數據庫中枚舉字段的字符串。

@Entity
public class Outer{

    @OneToOne(fetch = FetchType.EAGER,cascade = CascadeType.ALL)
    @JoinColumn(name = "current_status")
    private Status current;

    @OneToOne(fetch = FetchType.EAGER,cascade = CascadeType.ALL)
    @JoinColumn(name = "past_status")
    private Status past;
...
...

@Entity
public class Status{

    @Enumerated(EnumType.STRING)
    @Column(name = "state")
    private State state;

    @Id
    @GeneratedValue(generator="system-uuid")
    @GenericGenerator(name="system-uuid",strategy = "uuid2")
    @Column(name = "id")
    private String id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "outer_id")
    private Outer outer;

我為這兩個類創建了static meta models

如何使用where in子句創建一個Predicate來匹配State使用作為Strings提供的枚舉值(不是枚舉實例)?

您將實體屬性建模為Enum和Hibernate,因此,需要在所有JPQL或Criteria查詢中使用枚舉。

因此,您必須將所有String映射到State枚舉或使用本機SQL查詢

Hibernate不解析本機查詢,它們基於表模型而不是實體模型。 這允許您使用State枚舉的String表示形式。
你可以這樣做:

List<State> states = ... // get or initialize your State list here
Query q = em.createNativeQuery("SELECT * FROM Status s WHERE state IN (:states)", Status.class);
q.setParameter("states", states);
List<Status> s = (List<Status>) q.getResultList();

createNativeQuery方法的第二個參數告訴Hibernate將結果集的每個記錄映射到Status實體。 管理這些實體,您可以使用它們來更新或刪除映射的數據庫記錄。

要使用此映射,您需要確保查詢選擇實體映射的所有列。 我寫了一系列帖子,了解不同結果映射選項的更多細節:

暫無
暫無

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

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