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

Hibernate 如何在JPQL和Spring数据JPA中选择特定字段并作为实体类而不是对象返回?,hibernate,jpa,spring-data-jpa,jpql,Hibernate,Jpa,Spring Data Jpa,Jpql,我尝试使用Spring数据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).setMaxResul

我尝试使用Spring数据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();
String query=“从示例中选择exampleId、exampleNumber、exampleDate,其中exampleCost>'209879'和exampleDate介于'2010-11-17'和'2018-01-10'之间”;
Query q=entityManager.createQuery(Query).setMaxResults(limit);
List permitList=q.getResultList();
它返回的是对象数组列表,而不是示例列表。 请注意,所选字段根据客户需要而有所不同

当我签入时,我知道我们需要为所有选定字段创建CustomObject和多个构造函数


有什么办法可以满足我的要求吗?

我想你应该知道。在你拿到名单后,我们把它改成

List<Object> permitList = q.getResultList();
List permitList=q.getResultList();
然后将每个字段转换为示例的适当字段,如下所示

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;
List listEx=new ArrayList();
用于(对象o:权限列表){
示例e=新示例();
e、 setExampleId(o[0]);//您可能需要强制转换,您也可以这样做
//e.setExampleId((长)o[0])
e、 setExampleNumber(o[1]);
//根据客户需求等
添加(e);
}
返回listEx;

您可以使用
q.setResultTransformer(Transformers.aliasToBean(Yourclass.class))


Yourclass.class
是要将结果转换到的bean类。

您不能通过查询返回仅从数据库加载所需值的实体实例。最好的选择是使用投影查询并使用查询结果构造一个类,或者返回Object[]列表并将对象强制转换为链接问题中所述的适当类型

有一个选项可以修改实体并将属性的获取模式设置为延迟加载。这将改变实体的行为,而不仅仅是要使用的查询。另外,在实体属性上设置延迟加载只是hibernate的一个提示,属性仍然可以加载

要设置延迟加载,可以使用@Basic注释设置fetchType:

public class Example {

    int id;
    int number;

    @Basic(fetchType=FetchType.LAZY)
    String otherField;
} 

为什么不使用构造函数表达式,并在实体上使用构造函数来获取这些参数呢。然后你坚持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();
String query=“从示例e中选择新示例(e.exampleId、e.exampleNumber、e.exampleDate),其中e.exampleCost>209879,e.exampleDate介于“2010-11-17”和“2018-01-10”之间”;
Query q=entityManager.createQuery(Query).setMaxResults(limit);
List permitList=q.getResultList();

当然,这与“Spring数据”无关,与JPA API有关。另一种方法是将查询更改为简单的
从示例e中选择e,其中…
,并使用动态获取图:

然而,请注意:

  • 您可能需要使用持久性提供程序启用实体增强,以便延迟获取基本属性
  • 尝试访问图中指定属性之外的任何属性都会导致加载这些属性(上述方法是否适用于您取决于您如何处理结果)

这句话“它的返回列表而不是列表”是什么意思?@TahirHussainMir我已经更新了这个问题。因此,格式化程序在<>的文本之间被删除。它的“返回对象数组列表而不是示例列表”是的,您可以这样做。您可以获得示例列表,但其他字段将为空。我应该写答案吗?@TahirHussainMir是的,请写我正在寻找的javax.persistence.Query的可能副本。不是特定于休眠。我已经试过了。问题是每个请求的选择字段都不同。我不能创建多个构造函数,因为我的实体有40多个字段,并且不确定客户端将如何请求这些字段。这是唯一的方法。JPA无法知道这些随机选择的字段相对于您的类是什么。如果您希望动态地执行此操作,那么您可以使用JPA标准执行相同的操作,然后可以更改所选择的字段。。。但是您仍然需要一个合适的构造函数