如何在JPQL和Spring数据JPA中选择特定字段并返回实体类而不是对象?

时间:2018-03-29 08:43:14

标签: hibernate jpa spring-data-jpa jpql

我正在尝试使用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?

有没有其他方法可以达到我的要求?

5 个答案:

答案 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

但请注意:

  • 您可能需要使用持久性提供程序启用实体增强以延迟提取基本属性
  • 尝试访问除图表中指定的属性之外的任何属性将导致它们加载(上述方法是否适用于您取决于您​​处理结果的方式)