我使用 Hibernate
使用 NamedQuery
进行此查询,这是我的示例代码。
NamedQuery
@NamedQuery(name="com.company.generic.model.Student.getByID()",query="select name from com.company.generic.model.Student where id=:id")
Java 代码
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:
您很可能需要将别名添加到选择列表中的 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:
参见上面的答案
关于Java Hibernate NamedQuery 结果转换器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18475570/