我使用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:请参阅上方答案

10-08 00:57