2017-08-10 4 views
2

Ich habe die folgenden Entitäten mit Single-Table-Vererbungsstrategie.Wie wird der Diskriminatorwert in Ebean-Abfragen verwendet, wenn die Vererbung einzelner Tabellen verwendet wird?

@Entity 
@Inheritance 
@DiscriminatorColumn(name="type") 
public abstract class Vehicle extends com.avaje.ebean.Model { 
    @Id 
    public Long id; 
    public String name; 
    public String description; 
} 

@Entity 
@DiscriminatorValue("b") 
public class Bus extends Vehicle { 
    public String field1; 
} 

@Entity 
@DiscriminatorValue("c") 
public class Car extends Vehicle { 
    public String field2; 
} 

Ich habe eine Tabelle in meiner UI, die Zeilen mit Spalten der Fahrzeugfelder anzeigen sollte. Ich möchte eine erweiterte Suche platzieren, die Benutzer die Fahrzeugliste nach ihren Typen filtern können.

Meine Frage ist, wie kann ich eine Abfrage zu filtern Liste nach Fahrzeugtyp erstellen. Etwas wie folgt aus:

List<Vehicle> list = com.avaje.ebean.Ebean.find(Vehicle.class) 
    .where().eq("type", "c").findList(); 

Wenn ich ein Feld mit folgenden Definition einzufügen, die here diskutiert wurden, habe ich einen Fehler mit der Meldung „Fehler Injektion Konstruktor bekommen würde, java.lang.IllegalStateException: Immobilien theType nicht gefunden [ id, Name, Beschreibung] für Typklasse models.Vehicle“

@Column(name = "type", insertable = false, updatable = false) 
public String theType; 

Wenn ich es @Transient gesetzt, konnte ich es nicht in Abfragen verwenden.

Antwort

1

Sie können die Annotation @Formula verwenden, wie in ebean docs erläutert.

@Transient 
@Formula(select = "type") 
public String theType; 

Natürlich bemerkt, dass:

Da das Feld auch Transient ist es standardmäßig nicht in Abfragen enthalten ist - es muss ausdrücklich einbezogen werden.

Verwandte Themen