休眠: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

所以问题是HibernateConditionnement 实体中找不到属性langue_id,这是因为HibernateObject/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的主要内容,如果未能解决你的问题,请参考以下文章

vmware黑群晖硬盘休眠

休眠文件瘦身教程 Win10休眠文件怎么清

linux系统关闭休眠命令

惠普电脑休眠怎么唤醒

使用注解或使用休眠配置文件休眠

win10怎么把电脑休眠文件