【问题标题】:Hibernate : org.hibernate.QueryException休眠: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 使用实际属性名称而不是数据库中的基础列名称
  • 你有语言的数据库模式吗?

标签: java hibernate spring-boot orm hibernate-mapping


【解决方案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();
      }
      

      【讨论】:

        猜你喜欢
        • 2018-02-03
        • 1970-01-01
        • 2014-01-27
        • 2010-12-25
        • 1970-01-01
        • 2016-04-28
        • 1970-01-01
        • 2011-12-16
        相关资源
        最近更新 更多