我使用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)。这是namedQuery和使用resultTransformer的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:请参阅上方答案