我使用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)。我必须自己编写变压器吗?任何解决方法......?
非常感谢...
答案 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:
请参阅上面的答案