5

私には2つのエンティティがあります:

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Person implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "GEN_Person")
    @SequenceGenerator(name = "GEN_Person", sequenceName = "seq_person" , initialValue = 1, allocationSize = 10)
    @Column(nullable = false)
    private Long id;
    private String familienname;
    private String vorname;

    ...
}

そしてサブクラス:

@Entity
@DiscriminatorValue(value = "KIND")
public class Kind extends Person implements Serializable {
     ... // other properties
}

jpa2の条件クエリですべてのKind-Entitiesを検索したい。

私の質問:

public List<Kind> find(String f_name, String v_name) {
    CriteriaBuilder       cb         = em.getCriteriaBuilder();
    CriteriaQuery<Kind> cq         = cb.createQuery(Kind.class);
    EntityType<Kind>    type       = em.getMetamodel().entity(Kind.class);
    Root<Kind>          kindRoot = cq.from(Kind.class);

// Constructing list of parameters
List<Predicate> predicates = new ArrayList<Predicate>();

if ((null != f_name) &&!f_name.isEmpty()) {
    predicates.add(cb.like(cb.lower(kindRoot.get(type.getDeclaredSingularAttribute("familienname",
            String.class))), "%" + f_name.toLowerCase() + "%"));
}

if ((null != v_name) &&!v_name.isEmpty()) {
    predicates.add(cb.like(cb.lower(kindRoot.get(type.getDeclaredSingularAttribute("vorname",
            String.class))), "%" + v_name.toLowerCase() + "%"));
}

cq.select(kindRoot).where(predicates.toArray(new Predicate[] {}));

    return (List<Kind>) em.createQuery(cq).getResultList();
}

しかし、私はとてもエラーになります:

     javax.ejb.EJBException: EJB Exception: ; nested exception is: 
        java.lang.IllegalArgumentException: The declared attribute [familienname] from the managed type [EntityTypeImpl@441955560:Kind [ javaType: class com.itech_progress.kiwi.entities.Kind descriptor: 
RelationalDescriptor(com.itech_progress.kiwi.entities.Kind --> [DatabaseTable(PERSON), DatabaseTable(KIND)]), mappings: 19]] is not present - however, it is declared on a superclass.;

この場合のtypesaft基準クエリを作成するにはどうすればよいですか?

4

1 に答える 1

3

正規のメタモデルを生成することをお勧めします(リンクはHibernateのドキュメントへのリンクですが、JPAの場合は概念です)。から継承するため、クエリで直接使用できます。Kind_.familiennameKind_familiennamePerson_

それがオプションでない場合は、スーパークラスの属性をスーパークラスのメタモデルを介して参照する必要があります。

EntityType<Person> metamodelPerson = em.getMetamodel().entity(Person.class);
...
metamodelPerson.getDeclaredSingularAttribute("familienname", String.class)
于 2013-03-12T19:08:43.937 に答える