JPA 查询 是否只选择特定列而不使用条件查询?

2022-08-31 16:02:19

是否可以使用 JPA 查询从对象中仅选择属性 A 和 B,而不使用条件查询?

要选择所有属性,我只需执行如下操作:

SELECT i FROM ObjectName i WHERE i.id = 10

但是我在遗留系统上有一个具有许多属性的对象,并且只想选择几个,即使我知道选择几个属性通常很快。

在不使用条件查询的情况下,这是否可能?


答案 1

是的,就像在普通 sql 中一样,您可以指定要选择的属性类型:

SELECT i.firstProperty, i.secondProperty FROM ObjectName i WHERE i.id=10

执行此查询将返回 Object[] 的列表,其中每个数组都包含一个对象的选定属性。

另一种方法是将选定的属性包装在自定义对象中,然后在 TypedQuery 中执行它:

String query = "SELECT NEW CustomObject(i.firstProperty, i.secondProperty) FROM ObjectName i WHERE i.id=10";
TypedQuery<CustomObject> typedQuery = em.createQuery(query , CustomObject.class);
List<CustomObject> results = typedQuery.getResultList();

在本文中找到示例。

29.03.2018更新:

@Krish:

@PatrickLeitermann它给我的“Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: Unable to locate class ***” 异常。如何解决这个问题?

我猜你是在Spring应用程序的上下文中使用JPA,不是吗?其他一些人也有完全相同的问题,他们的解决方案是在SELECT NEW关键字之后添加完全限定的名称(例如.com.example.CustomObject)。

也许Spring数据框架的内部实现只能识别用@Entity注释的类,或者通过其简单名称在特定orm文件中注册的类,这会导致使用此解决方法。


答案 2

您可以使用类似如下的内容:

List<Object[]> list = em.createQuery("SELECT p.field1, p.field2 FROM Entity p").getResultList();

然后你可以迭代它:

for (Object[] obj : list){
    System.out.println(obj[0]);
    System.out.println(obj[1]);
}

但是,如果您在查询中只有一个字段,则您将获得一个不是来自 Object[] 的类型列表。


推荐