2012-03-14 81 views
6

我想从一个方法中做一个简单的选择计数语句,该方法适用于我的另一部分程序,但在这里它给了我错误。java hibernate无法解析属性

public Long validateSub(String source, String tbl){ 
    Session session = HibernateUtil.getSessionFactory().openSession(); 
    session.beginTransaction(); 


    Query q = session.createQuery("SELECT count(s) from SlaveSubscribers s where s.SOURCENAME = :sourcename AND s.TBL = :tbl"); 
    q.setParameter("sourcename", source); 
    q.setParameter("tbl", tbl); 

    Long result = (Long) q.list().get(0); 
    session.getTransaction().commit(); 

    return result; 

} 

错误消息:

Exception in thread "Thread-3" org.hibernate.QueryException: could not resolve property: SOURCENAME of: com.datadistributor.main.SlaveSubscribers [SELECT count(s) from com.datadistributor.main.SlaveSubscribers s where s.SOURCENAME = :sourcename AND s.TBL = :tbl] 

我不知道为什么这不起作用

+0

请发布一个提取您的类SlaveSubscribers(成员声明和getter/setter for sourcename)和该类的hibernate映射文件(如果存在)。错误必须在那里。 – Johanna 2012-03-15 07:54:52

回答

5

您不必在SlaveSubscribers实体持久属性(场)SOURCENAME。最有可能的SOURCENAME是数据库列的名称。在HQL中,您需要使用该字段的名称(区分大小写)。

6

只是为了澄清上述答案,因为我会恨任何人错过它。

Hibernate在类中使用查询的变量属性,而不是数据库中的列名。

因此,如果你有这样的模型类:

private Long studentId; 

@Id 
@GeneratedValue 
@Column(name="studentid") 
public Long getStudentId() 
{ 
    return studentId; 
} 

你必须做一个查询上studentId没有studentid

+0

伟大的笔记,这帮了我很多。我想补充说的是,在类中定义的变量的情况并不重要。例如,你也可以将类中的Long变量定义为'studentid'而不是'studentId',只要getter具有'I'大写,你仍然需要将'I'大写你的查询也是如此。 – 2017-01-04 22:04:09

相关问题