我正在尝试使用Spring Data JPA和JPQL选择特定字段,如下所示:
String query = "Select exampleId, exampleNumber, exampleDate FROM Example Where exampleCost>'209879' And exampleDate BETWEEN '2010-11-17' AND '2018-01-10'";
Query q = entityManager.createQuery(query).setMaxResults(limit);
List<Example> permitList = q.getResultList();
返回对象数组列表而不是实例列表。 请注意,根据客户需要,选择字段会有所不同。
当我签入SO时,我发现我们需要为所有选定的字段创建CustomObject和多个构造函数。
JPA Query selecting only specific columns without using Criteria Query?
有没有其他方法可以达到我的要求?
答案 0 :(得分:0)
我想你应该知道。获得列表后,让我们将其更改为
List<Object> permitList = q.getResultList();
然后将每个字段转换为Example的相应字段,如此
List<Example> listEx = new ArrayList<Example>();
for(Object o : permitList){
Example e = new Example();
e.setExampleId(o[0]); //You might need casting, you can do that too like this
// e.setExampleId((Long)o[0])
e.setExampleNumber(o[1]);
//and so on as per client needs
listEx.add(e);
}
return listEx;
答案 1 :(得分:0)
您可以使用q.setResultTransformer(Transformers.aliasToBean(Yourclass.class));
Yourclass.class
是要将结果转换为的bean类。
答案 2 :(得分:0)
您无法使查询返回仅从数据库加载所需值的实体实例。您最好的选择是使用投影查询并使用查询结果构造一个类,或者返回一个List of Object []并将对象强制转换为链接问题中描述的相应类型。
可以选择修改实体并将属性的提取模式设置为延迟加载。这会更改实体的行为,而不仅仅是您要使用的查询。此外,在实体属性上设置延迟加载只是对hibernate的一个提示,无论如何仍然可以加载属性。
要设置延迟加载,可以使用@Basic注释设置fetchType:
public class Example {
int id;
int number;
@Basic(fetchType=FetchType.LAZY)
String otherField;
}
答案 3 :(得分:0)
为什么不使用构造函数表达式,并在您的实体上使用构造函数来获取这些参数。然后你坚持JPA规范......
String query = "SELECT new Example(e.exampleId, e.exampleNumber, e.exampleDate) FROM Example e WHERE e.exampleCost > 209879 AND e.exampleDate BETWEEN '2010-11-17' AND '2018-01-10'";
Query q = entityManager.createQuery(query).setMaxResults(limit);
List<Example> permitList = q.getResultList();
当然,这与#34; Spring Data&#34;无关。以及与JPA API相关的一切
答案 4 :(得分:0)
另一种方法是将您的查询更改为简单的SELECT e FROM Example e WHERE ...
,并使用动态提取图表:https://docs.oracle.com/javaee/7/tutorial/persistence-entitygraphs001.htm
但请注意: