JPA 查询 是否只选择特定列而不使用条件查询?
2022-08-31 16:02:19
是否可以使用 JPA
查询从对象中仅选择属性 A 和 B,而不使用条件查询?
要选择所有属性,我只需执行如下操作:
SELECT i FROM ObjectName i WHERE i.id = 10
但是我在遗留系统上有一个具有许多属性的对象,并且只想选择几个,即使我知道选择几个属性通常很快。
在不使用条件查询的情况下,这是否可能?
是否可以使用 JPA
查询从对象中仅选择属性 A 和 B,而不使用条件查询?
要选择所有属性,我只需执行如下操作:
SELECT i FROM ObjectName i WHERE i.id = 10
但是我在遗留系统上有一个具有许多属性的对象,并且只想选择几个,即使我知道选择几个属性通常很快。
在不使用条件查询的情况下,这是否可能?
是的,就像在普通 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文件中注册的类,这会导致使用此解决方法。
您可以使用类似如下的内容:
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[] 的类型列表。