0

CriteriaAPIを使用してクエリを実行中に例外を取得する

 org.hibernate.QueryException: could not resolve property: com of: com.data.Collage        at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:44)
    at org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:38)
    at org.hibernate.persister.entity.AbstractEntityPersister.toType(AbstractEntityPersister.java:1362)
    at org.hibernate.loader.criteria.CriteriaQueryTranslator.getPathEntityName(CriteriaQueryTranslator.java:204)
    at org.hibernate.loader.criteria.CriteriaQueryTranslator.createCriteriaEntityNameMap(CriteriaQueryTranslator.java:191)
    at org.hibernate.loader.criteria.CriteriaQueryTranslator.<init>(CriteriaQueryTranslator.java:81)
    at org.hibernate.loader.criteria.CriteriaLoader.<init>(CriteriaLoader.java:58)
    at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1550)
    at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283)

次のようなクラス定義を持つ

class Collage {
int id;
String collageName;
List lstStudent;
}

class Student{
String studentName;
int id;
}

上記のクラスのマッピングを完了しました。

現在、collageIDとStudentIDを持っている単一のクエリでコラージュ名と学生名を取得しようとしています。これにはCriteriaAPIを使用しました。

Criteria cr = session.createCriteria("com.data.Collage","collageAlias");
cr.createAlias("com.data.Student","studentAlias");
cr.add(Restrictions.eq("collageAlias.id", "402882c2369bc53901369bc95d5f0137"));
cr.add(Restrictions.eq("studentAlias.id","ff80808134cbe5a10134d14ff20300a9"));

ProjectionList properties = Projections.projectionList();
properties.add(Projections.property("collageAlias.collageName"));
properties.add(Projections.property("studentAlias.studentName"));

cr.setProjection(properties);
List collage_student = cr.list();

Collage.classを試してみましたが、criteria APIのデフォルトクラスとしてコラージュのエイリアス名を削除しましたが、機能しませんでした。

なにか提案を?

4

1 に答える 1

2

あなたがするとき

cr.createAlias("com.data.Student","studentAlias");

基準はクラスに基づいて構築されているため、Hibernateは自動的にStudentがCollageクラスのフィールドであると見なします。エイリアスを作成することにより、その特定のエンティティに自動的に参加します。

Collageクラスには「com.data.Student」という名前のプロパティがないため、エラーが発生します。

コードのリファクタリングを少し検討する必要があります。エンティティCollageのリストを処理する場合は、に変更します。これで、クラスをマップして、2つのエンティティ間の関係をHibernateに伝えることができます。StudentList lstStudentList<Student> lstStudent

@Entity
class Collage {
    int id;
    String collageName;
    List<Student> lstStudent;
}

@Entity
class Student{
    String studentName;
    Collage collage;
    int id;
}

ゲッターのCollageクラスでは、次のList<Student> lstStudentようになります。

@OneToMany(fetch = FetchType.LAZY, mappedBy = "collage")
public List<Student> getStudents() {
    return this.lstStudents;
}

、あなたStudentのゲッターのためのクラスにいる間、Collage持っているでしょう:

@ManyToOne(fetch = FetchType.LAZY)
public Collage getCollage(){
    return this.collage;
}

これにより、基本的に、クラスにCriteriaを作成し、次Collageのリストへのエイリアスを使用して直接アクセスできますStudents

cr.createAlias("lstStudent", "studentsAlias");     
于 2012-09-10T11:43:18.280 に答える