У меня есть исключение org.hibernate.QueryException, и я не понимаю, почему.
Свойство langue_id, не разрешенное спящим режимом, определено в моем объекте Conditionnement.
Трассировки стека
Caused by: org.hibernate.QueryException: could not resolve property: langue_id of: fr.sita.g2fm.domain.referentiel.Conditionnement
at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:62) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
at org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:56) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
at org.hibernate.persister.entity.AbstractEntityPersister.toType(AbstractEntityPersister.java:1805) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
at org.hibernate.loader.criteria.EntityCriteriaInfoProvider.getType(EntityCriteriaInfoProvider.java:39) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
at org.hibernate.loader.criteria.CriteriaQueryTranslator.getPathInfo(CriteriaQueryTranslator.java:228) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
at org.hibernate.loader.criteria.CriteriaQueryTranslator.createCriteriaEntityNameMap(CriteriaQueryTranslator.java:212) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
at org.hibernate.loader.criteria.CriteriaQueryTranslator.<init>(CriteriaQueryTranslator.java:94) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
at org.hibernate.loader.criteria.CriteriaLoader.<init>(CriteriaLoader.java:71) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1760) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
at org.hibernate.internal.CriteriaImpl.list(CriteriaImpl.java:363) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
Организация
@Entity
@Data
@Table(uniqueConstraints = @UniqueConstraint(name = "UNIQUE_CONDITIONNEMENT_DESIGNATION", columnNames = {
"designation"}))
public class Conditionnement implements IdObject, Serializable {
private static final long serialVersionUID = 7096113289274101792L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private Long codeConditionnement;
@NotNull(message = ERROR_CODE_MANDATORY_FIELD)
private String designation;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "langue_id")
@NotNull(message = ERROR_CODE_MANDATORY_FIELD)
@ForeignKey(name = "FK_CONDITIONNEMENT_LANGUE")
private Langue langue;
}
Наконец, метод в моем DAO
@Override
public List<Conditionnement> find(ConditionnementCriteria conditionnementCriteria) {
Criteria criteria = getHibernateSession().createCriteria(Conditionnement.class, "c");
criteria.createCriteria("c.langue_id", "l", JoinType.LEFT_OUTER_JOIN);
return criteria.list();
}
Вы хоть представляете, что вызывает это исключение?
Спасибо за помощь.
У вас есть схема БД для Langue?




Измените c.langue_id на c.langue, как показано ниже, поскольку спящий режим не может найти столбец с именем langue_id.
public List<Conditionnement> find(ConditionnementCriteria conditionnementCriteria) {
Criteria criteria = getHibernateSession().createCriteria(Conditionnement.class, "c");
criteria.createCriteria("c.langue", "l", JoinType.LEFT_OUTER_JOIN);
return criteria.list();
}
Проблема заключается в том, что в спящем режиме не обнаружено отображение для столбца c.langue_id в Conditionnement, хотя в таблице присутствует столбец. Вам следует сменить c.langue_id на c.langue
public List<Conditionnement> find(ConditionnementCriteria conditionnementCriteria) {
Criteria criteria = getHibernateSession().createCriteria(Conditionnement.class, "c");
criteria.createCriteria("c.langue", "l", JoinType.LEFT_OUTER_JOIN);
return criteria.list();
}
Исключение просто, когда говорится:
Caused by: org.hibernate.QueryException: could not resolve property: langue_id of: fr.sita.g2fm.domain.referentiel.Conditionnement
Итак, проблема в том, что Hibernate не может найти свойство langue_id в вашем объекте Conditionnement, и это потому, что Hibernate является Рамка Объектно-реляционное отображение (ORM), поэтому он обрабатывает objects/entities, а не tables, поэтому он будет искать класс properties, а не таблицу columns.
А в вашей сущности у вас есть:
private Langue langue;
Итак, вам нужен этот запрос:
@Override
public List<Conditionnement> find(ConditionnementCriteria conditionnementCriteria) {
Criteria criteria = getHibernateSession().createCriteria(Conditionnement.class, "c");
criteria.createCriteria("c.langue", "l", JoinType.LEFT_OUTER_JOIN);
return criteria.list();
}
c.langue_idне существует в его нынешнем виде. Попробуйте сc.langue. Hibernate используется для фактических имен свойств, а не для имени основного столбца в базе данных, когда вы создаете запрос / критерии