Использование критериев Hibernate для получения свойств двух объектов

Получение исключения при выполнении запроса с использованием Criteria API

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

Сделали сопоставление для вышеуказанных классов.

Теперь я пытаюсь получить имя коллажа и имя студента в одном запросе, где у меня есть идентификатор коллажа и идентификатор студента. Использовал Criteria API для этого.

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, удалил псевдоним для коллажа в качестве класса по умолчанию для API критериев, но это не сработало.

Любое предложение?


person user1041580    schedule 10.09.2012    source источник
comment
Просто мысль, поскольку ваши поля являются частными пакетами, они могут быть недоступны для другого вашего кода (если он не находится в том же пакете). Попробуйте сделать их общедоступными или добавить для них геттеры и сеттеры.   -  person Shivan Dragon    schedule 10.09.2012


Ответы (1)


Когда вы делаете

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

Hibernate автоматически считает, что Student является полем класса Collage, так как критерии построены на этом классе. Создавая псевдоним, вы автоматически выполняете соединение с этим конкретным объектом.

Поскольку ваш класс Collage не имеет свойства с именем «com.data.Student», это вызывает вашу ошибку.

Вам следует подумать о небольшом рефакторинге вашего кода. Если вы хотите, чтобы Collage обрабатывал список из Student сущностей, измените List lstStudent на List<Student> lstStudent. Теперь вы можете сопоставить классы, чтобы указать Hibernate связь между двумя объектами:

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

Это в основном позволяет вам создать критерии для класса Collage и иметь прямой доступ с псевдонимом к его списку Students:

cr.createAlias("lstStudent", "studentsAlias");     
person Raul Rene    schedule 10.09.2012