引起:org.hibernate.QueryException:无法解析属性:last_name [英] Caused by: org.hibernate.QueryException: could not resolve property: last_name

查看:178
本文介绍了引起:org.hibernate.QueryException:无法解析属性:last_name的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有这个代码工作有我想要的输出

I have this code working having my desired output

String hql = "FROM Employee ORDER BY last_name";  
Query query = session.createQuery(hql);  
employeeList = query.list();  

我尝试了这段代码,但是失败了

I tried this code but it fails

String hql = "FROM Employee E ORDER BY E.last_name";
Query query = session.createQuery(hql);
employeeList = query.list();  

以下是例外情况

Exception in thread "main" java.lang.IllegalArgumentException: org.hibernate.QueryException: could not resolve property: last_name of: com.hibernate.exercise6.model.Employee [FROM com.hibernate.exercise6.model.Employee E ORDER BY E.last_name]
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:131)
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:155)
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:162)
at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:631)
at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:101)
at com.hibernate.exercise6.service.EmployeeFunctions.listEmployees(EmployeeFunctions.java:208)
at com.hibernate.exercise6.app.GUIMain.displayListMenu(GUIMain.java:329)
at com.hibernate.exercise6.app.GUIMain.manageRecords(GUIMain.java:140)
at com.hibernate.exercise6.app.GUIMain.main(GUIMain.java:62)
Caused by: org.hibernate.QueryException: could not resolve property: last_name of: com.hibernate.exercise6.model.Employee [FROM com.hibernate.exercise6.model.Employee E ORDER BY E.last_name]
at org.hibernate.QueryException.generateQueryException(QueryException.java:120)
at org.hibernate.QueryException.wrapWithQueryString(QueryException.java:103)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:218)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:142)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:115)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:77)
at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:152)
at org.hibernate.internal.AbstractSharedSessionContract.getQueryPlan(AbstractSharedSessionContract.java:521)
at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:623)
... 5 more
Caused by: org.hibernate.QueryException: could not resolve property: last_name of: com.hibernate.exercise6.model.Employee
at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:62)
at org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:56)
at org.hibernate.persister.entity.AbstractEntityPersister.toType(AbstractEntityPersister.java:1801)
at org.hibernate.hql.internal.ast.tree.FromElementType.getPropertyType(FromElementType.java:393)
at org.hibernate.hql.internal.ast.tree.FromElement.getPropertyType(FromElement.java:505)
at org.hibernate.hql.internal.ast.tree.DotNode.getDataType(DotNode.java:660)
at org.hibernate.hql.internal.ast.tree.DotNode.prepareLhs(DotNode.java:264)
at org.hibernate.hql.internal.ast.tree.DotNode.resolve(DotNode.java:204)
at org.hibernate.hql.internal.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:109)
at org.hibernate.hql.internal.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:104)
at org.hibernate.hql.internal.ast.HqlSqlWalker.resolve(HqlSqlWalker.java:1013)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.expr(HqlSqlBaseWalker.java:1286)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.orderExpr(HqlSqlBaseWalker.java:1860)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.orderExprs(HqlSqlBaseWalker.java:1657)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.orderClause(HqlSqlBaseWalker.java:1630)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:652)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:311)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:259)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:262)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:190)
... 11 more  

Employee.java

Employee.java

package com.hibernate.exercise6.model;

import java.util.Set;
import java.util.Comparator;

public class Employee extends Id{
private int uniqueId;
private Name nameInfo;
private Address addressInfo;
private OtherInfo otherInfo;
private Set contact;
private Set role;

public Employee() {}

public Employee(Name nameInfo, Address addressInfo, OtherInfo otherInfo){
    this.nameInfo = nameInfo;
    this.addressInfo = addressInfo;
    this.otherInfo = otherInfo;
}

public void setId(int uniqueId){
    this.uniqueId = uniqueId;
}
public int getId(){
    return uniqueId;
}

public void setName(Name nameInfo){
    this.nameInfo = nameInfo;
}
public Name getName(){
    return nameInfo;
}

public void setAddress(Address addressInfo){
    this.addressInfo = addressInfo;
}
public Address getAddress(){
    return addressInfo;
}

public void setOtherInfo(OtherInfo otherInfo){
    this.otherInfo = otherInfo;
}
public OtherInfo getOtherInfo(){
    return otherInfo;
}

public void setContacts(Set contact){
    this.contact = contact;
}
public Set getContacts(){
    return contact;
}

public void setRole(Set role){
    this.role = role;
}
public Set getRole(){
    return role;
}

public static Comparator<Employee> employeeGwaComparator = new Comparator<Employee>(){
    public int compare(Employee emp1, Employee emp2){
        String emp1Gwa = String.valueOf(emp1.otherInfo.getGwa());
        String emp2Gwa = String.valueOf(emp2.otherInfo.getGwa());

        return emp1Gwa.compareTo(emp2Gwa);
    }       
};
}  

Name.java

Name.java

package com.hibernate.exercise6.model;

public class Name{
private String firstName,
                                lastName,
                                middleName,
                                suffix,
                                title;

public Name() {}

public Name(String title, String firstName, String middleName, String lastName, String suffix){
    this.title = title;
    this.firstName = firstName;
    this.middleName = middleName;
    this.lastName = lastName;
    this.suffix = suffix;
}

public void setTitle(String title){
    this.title = title;
}
public String getTitle(){
    return title;
} 

public void setFirstName(String firstName){
    this.firstName = firstName;
}
public String getFirstName(){
    return firstName;
}

public void setMiddleName(String middleName){
    this.middleName = middleName;
}
public String getMiddleName(){
    return middleName;
}

public void setLastName(String lastName){
    this.lastName = lastName;
}
public String getLastName(){
    return lastName;
}

public void setSuffix(String suffix){
    this.suffix = suffix;
}
public String getSuffix(){
    return suffix;
}
}

第一个代码和第二个代码不应该表现为同样的方式?只有一个别名被引入,我是正确的吗?

Shouldn't the first code and second code behave the same way? only an alias was introduced, am i correct?

推荐答案


  1. 真实的列名称由实体的属性。在你的情况下,属性名称是 lastName ,列名称是 last_name 。因此,如果您使用HQL,则必须使用属性,如果要实现 NativeQuery ,则可以使用列名称。

  1. In HQL you access the real column name by the entity's property. In your case the property name is lastName and the column name is last_name. So if you are using HQL you'll have to use properties, you can use column name if you want to implement NativeQuery.

您正在 Employee 实体上执行 SELECT 子句,该实体具有名称作为属性,而这最后也具有 lastName 作为属性。所以你的查询必须写成如下:

You are performing a SELECT clause on Employee entity which has name as property and this last have lastName as property as well. So your query must be written as bellow :

String hql = "FROM Employee E ORDER BY E.name.lastName";  
Query query = session.createQuery(hql);  
employeeList = query.list(); 


这篇关于引起:org.hibernate.QueryException:无法解析属性:last_name的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆