Java Hibernate NamedQuery resultTransformer

时间:2013-08-27 21:11:52

标签: java hibernate named-query

我使用NamedQuery使用Hibernate进行此查询,这是我的示例代码。

NamedQuery

@NamedQuery(name="com.company.generic.model.Student.getByID()",query="select name from com.company.generic.model.Student where id=:id")

Java Code

private Student getStudentNameById(Integer id)
{
    final Session session = ....
    final Query query = session.getNamedQuery("com.company.generic.model.Student.getByID()")
    .setParameter("id",id)
    .setResultTransformer(Transformers.aliasToBean(Student.class));
    final Student student = (Student)query.uniqueResult();
    return student;
}

当查询返回所有列时resultTransformer正常工作但是当我只返回几列时返回

Exception in thread "main" org.hibernate.PropertyNotFoundException: Could not find setter for 0 on class com.company.generic.model.Student

我的问题是

1)。为什么适用于所有列但不使用少数列或仅使用列。

2)。这是使用resultTransformer的namedQuery和Criteria之间的差异,应该是namedQuery有setProjection吗?

3)。我必须自己编写变压器吗?任何解决方法......?

非常感谢...

1 个答案:

答案 0 :(得分:1)

问题#1:
您很可能需要在选择列表

中的name字段中添加别名
select s.name as name from com.company.generic.model.Student s where s.id=:id

所以Hibernate可以在Student.class中找到setName(String)方法 使用标准等效是

session.createCriteria(Student.class)
 .add(Restrictions.eq("id",id))
 .setProjection(Projections.property("name").as("name"))
 .setResultTransformer(Transformers.aliasToBean(Student.class));

问题#2:
命名查询选择列表是投影。

问题#3:
请参阅上面的答案