2017-12-07 3 views
0

私は基準クエリ休止ミス既存のフィールド

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

を行うと、where句でライン上のエラーを取得し、そのようなエンティティの構造

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

を持っています。しばらくのデバッグ後

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

私は、エンティティマネージャのメタモデルのParentメタクラスがプロパティの子をACのListとして保持していることを発見しました。 ACには明らかにフィールド「値」は含まれていません。

このエラーを解決する方法はありますか?

答えて

0

簡単な修正はないと思います。 valueACに移動させてCCAC<CP>に拡張する場合を除き、または何か同じように。

この現象は、タイプの消去のためです。

childrenの実際のジェネリックタイプは、実行時に使用できません。これは、コンパイラキャストが、上限のACに基づいてジェネリックタイプList<AC>にリストされるためです。

また、このことを私に非常によく説明したgreat answerも参照してください。

クエリの後、リスト/アイテムを実際のタイプにチェックしてキャストできますが、可能であればCriteriaQuery内にあるかどうかは完全には確認できません。