Java Hibernate NamedQuery 结果转换器

标签 java hibernate named-query

我使用 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/

相关文章:

Hibernate 命名查询和启动性能

java - 使用 HttpURLConnection 提交 json POST 请求

java - 静态方法与否?全局变量?

java - Hibernate 条件按时间戳中的日期对结果进行分组

java - Spring 2.5 Hibernate 3.5 命名查询

java - Hibernate 生成子类的 @discriminatorvalues 类型错误的查询

java - 地理编码,获取角点纬度经度

java - 数组列表和 ListView

java - 从 Spring 调用 Oracle 存储函数

JAVA:这个类有一个复合主键。它必须使用 ID 类