假设我有一个Person模型(Java类和数据库表),其中包含名称,年龄,性别,身高,体重等列/字段。
现在有两种可能性
1)我需要整个列数据。所以我会得到命名查询 作为;
@NamedQuery(name =“Person.findAll”,query =“从Person中选择p 在哪里......“
2)我只需要特定的列数据。所以我将命名查询作为;
@NamedQuery(name =“Person.findSpecific”,query =“选择p.name, 来自人员的行为......“
在第一种情况下,如果我调用/执行命名查询为;
Query query = getNamedQuery("Person.findAll");
它会自动将响应映射到Person Java类。但在第二种情况下(具体列),它没有。它将响应显示为Vector with Object数组。
我的问题是,当我使用特定列查询时,是否有任何明确的方法可以自动将查询响应映射到我的自定义类
我已经尝试了
Query query = getNamedQuery("Person.findSpecific",Person.class);
但这又不会将它映射到Person类。
答案 0 :(得分:2)
您可以在任何JPA查询的select子句中使用constructor expressions:
select new my.app.PersonView(p.name, p.age) from Person p ...
在这种情况下,对于结果中的每一行,都会创建一个新的PersonView
实例。
请注意,此实例未连接到数据源(它们不受管理),因此您无法通过修改实例来更改基础数据。
这就是为什么我建议不要在构造函数表达式中使用实体类来将它们与“真实”实体混合起来。而是编写仅承载数据的自定义“传输对象”。每个投影都有一个定制的类,或者 - 如果需要在同一个实体上有许多不同的投影 - 一个更大的类,有多个构造函数用于所有投影。在这种情况下,某些字段将始终为空。