2017-11-22 1 views
3

Der Versuch, specification für Filterdaten auf Datenbankebene zu verwenden. Ich habe eine Entität mit einer anderen Entität als eine Instanz, in der die Instanzvariablenklasse ein Emun-Feld enthält. Dies ist standardmäßig eine Zeichenfolge in der Datenbank für das enum-Feld.Umgang mit Enums als Zeichenfolge im Frühjahr Daten jpa Spezifikation

@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; 

Ich habe static meta models erstellt sowohl für die Klassen.

Wie erstelle ich ein PredicateState paßt eine where in Klausel mit dem ENUM-Wert als Strings (keine Instanzen von Aufzählungen) geliefert mit?

+0

Nun in einer Reihe von 'Enum vorbei 'ie -' State 'macht es für mich in der' in 'Klausel mit der offensichtlichen Tatsache, dass ich 'Strings' in' Enums' umwandeln muss. –

+0

An erster Stelle, können Sie Entitäten verschachteln? Laut JPA-Spezifikation müssen sie Top-Level-Klassen sein. – ujulu

+0

Sorry @ujulu, wenn meine Aussagen irreführend sind. Aber die Entitäten sind nicht verschachtelt, d. H. - keine innere Klasse. Beachten Sie, dass beide Klassen "öffentlich" sind. Es ist nur, dass ich nicht die komplette Klasse gezeigt habe. –

Antwort

0

Sie haben das Entitätsattribut als Enum modelliert, und Hibernate erwartet daher eine Aufzählung in allen JPQL- oder Kriterienabfragen.

Sie müssen also entweder alle String s auf State enums mappen oder einen native SQL query verwenden.

Hibernate analysiert native Abfragen nicht und basiert auf dem Tabellenmodell anstelle des Entitätsmodells. Damit können Sie die String Darstellung Ihrer State Enumeration verwenden.
Sie können etwas tun:

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(); 

Der zweite Parameter der createNativeQuery Methode teilen jeden Datensatz des Ergebnisses zu einer Status Einheit auf der Karte Ruhezustand. Diese Entitäten werden verwaltet, und Sie können sie verwenden, um die zugeordneten Datenbankdatensätze zu aktualisieren oder zu entfernen.

Um diese Zuordnung zu verwenden, müssen Sie sicherstellen, dass Ihre Abfrage alle von der Entität zugeordneten Spalten auswählt. Ich schrieb eine Reihe von Beiträgen, die auf den anderen Ergebnis Mapping-Optionen in mehr Details zu erhalten:

+0

Danke @Thorben aber wie ich in meinem 1. Kommentar aktualisiert hatte, habe ich schon beantwortet. Ich übergebe Instanzen der Aufzählung im Feld "in" nach dem Erstellen einer Verknüpfung für die Instanzklasse. –

Verwandte Themen