休眠:org.hibernate.QueryException
Posted
技术标签:
【中文标题】休眠:org.hibernate.QueryException【英文标题】:Hibernate : org.hibernate.QueryException 【发布时间】:2019-04-18 17:57:45 【问题描述】:我有一个 org.hibernate.QueryException,但我无法理解原因。
hibernate 未解析的属性 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();
你知道是什么导致了这个异常吗?
感谢您的帮助。
【问题讨论】:
c.langue_id
并不存在。试试c.langue
。当您创建查询/条件时,Hibernate 使用实际属性名称而不是数据库中的基础列名称
你有语言的数据库模式吗?
【参考方案1】:
将c.langue_id
更改为c.langue
如下所示,因为hibernate 无法找到名称为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();
【讨论】:
【参考方案2】:问题是休眠在Conditionnement
中找不到列c.langue_id
的映射,尽管表中存在列。您应该将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();
【讨论】:
【参考方案3】:异常很简单:
原因:org.hibernate.QueryException:无法解析属性:langue_id of:fr.sita.g2fm.domain.referentiel.Conditionnement
所以问题是Hibernate
在Conditionnement
实体中找不到属性langue_id
,这是因为Hibernate
是Object/Relational Mapping (ORM) framework,所以它处理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();
【讨论】:
以上是关于休眠:org.hibernate.QueryException的主要内容,如果未能解决你的问题,请参考以下文章