2017-12-07 2 views
0

ich eine solche Einheit Struktur habenHibernate Fehl bestehenden Feld

@MappedSuperclass 
public abstract class Base { 
    UUID id; 
} 

@MappedSuperclass 
public abstract class Parent<C extends Child> extends Base { 
    @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval = true) 
    private List<C> children; 
} 

@MappedSuperclass 
public abstract class Child<P extends Parent> extends Base { 
    @JoinColumn(name = "parent_id", referencedColumnName = "id") 
    @ManyToOne(optional = false) 
    private P parent; 
} 

@Entity 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
@Table(name = "ap") 
public class AP extends Parent<AC> {} 

@Entity 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
@Table(name = "ac") 
public class AC extends Child<AP> {} 

@Entity 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
@Table(name = "bp") 
public class BP extends Parent<BC> {} 

@Entity 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
@Table(name = "bc") 
public class BC extends Child<BP> {} 

@Entity 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
@Table(name = "cp") 
public class CP extends Parent<CC> {} 

@Entity 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
@Table(name = "cc") 
public class CC extends Child<CP> { 
    String value; 
} 

ich tun Kriterien Abfrage

CriteriaQuery<Long> cq = getEntityManager().getCriteriaBuilder().createQuery(Long.class); 
    Root<CP> rt = cq.from(CP.class); 
    Path child = rt.join("children"); 
    final CriteriaBuilder criteriaBuilder = getEntityManager().getCriteriaBuilder(); 
    cq.select(criteriaBuilder.count(rt)); 
    cq.where(criteriaBuilder.equal(child.get("value"), "exists")); 
    TypedQuery<Long> q = getEntityManager().createQuery(cq); 
    Long res = q.getSingleResult() 

und erhalten Fehler in Zeile mit where-Klausel:

java.lang.IllegalArgumentException: Unable to locate Attribute with the the given name [value] on this ManagedType [Base] 

Nach einer während des Debuggens Ich habe herausgefunden, dass die Meta-Klasse "Eltern" im Entitätsmanager-Metamodell die Eigenschaften "Kinder" als "Liste der AC" behält. AC enthält offensichtlich kein Feld "value".

Haben Sie eine Idee, wie Sie diesen Fehler beheben können?

Antwort

0

Ich denke, es gibt keine einfache Lösung. Sofern Sie nicht bereit sind, value zu AC zu verschieben und CC zu erweitern, um AC<CP> zu erweitern. Oder etwas Ähnliches.

Dieses Verhalten ist wegen Typ löschen.

Der eigentliche generische Typ von children ist zur Laufzeit nicht verfügbar, da der Compiler basierend auf der oberen Grenze AC eine Liste nach generischem Typ List<AC> erstellt.

Siehe auch diese great answer, die mir diese Sache ziemlich gut erklärt.

Nach Abfrage ist es möglich, die Liste/Elemente zu tatsächlichen Typ zu überprüfen und zu werfen, aber nicht sicher, ob es innerhalb CriteriaQuery möglich ist.

Verwandte Themen