Edy*_*rne 43 java jpa criteriaquery jpa-2.0 jpa-2.1
是否可以使用JPA查询从对象中仅选择属性A和B而不使用条件查询?
要选择所有属性,我只需执行以下操作:
SELECT i FROM ObjectName i WHERE i.id = 10
Run Code Online (Sandbox Code Playgroud)
但是我在遗留系统上有一个具有许多属性的对象,并且想要选择几个,即使我知道选择几个属性通常很快.
这可能不使用标准查询吗?
谢谢!
Pat*_*ann 85
是的,就像在普通的SQL中一样,您可以指定要选择的属性类型:
SELECT i.firstProperty, i.secondProperty FROM ObjectName i WHERE i.id=10
Run Code Online (Sandbox Code Playgroud)
执行此查询将返回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();
Run Code Online (Sandbox Code Playgroud)
例子中可以找到这个文章.
更新29.03.2018:
@Krish:
@PatrickLeitermann对我公司给予"产生的原因:org.hibernate.hql.internal.ast.QuerySyntaxException:找不到类***"异常.怎么解决这个?
我猜你是在Spring应用程序的上下文中使用JPA,不是吗?其他一些人有完全相同的问题,他们的解决方案是在SELECT NEW关键字后添加完全限定名称(例如com.example.CustomObject).
也许Spring数据框架的内部实现只识别使用@Entity注释的类或通过其简单名称在特定orm文件中注册的类,这导致使用此变通方法.
pL4*_*u33 19
你可以使用这样的东西:
List<Object[]> list = em.createQuery("SELECT p.field1, p.field2 FROM Entity p").getResultList();
Run Code Online (Sandbox Code Playgroud)
然后你可以迭代它:
for (Object[] obj : list){
System.out.println(obj[0]);
System.out.println(obj[1]);
}
Run Code Online (Sandbox Code Playgroud)
但是如果查询中只有一个字段,则会得到一个不是来自Object []的类型列表
很好的答案!我确实有一个小的补充.关于此解决方案:
TypedQuery<CustomObject> typedQuery = em.createQuery(query , String query = "SELECT NEW CustomObject(i.firstProperty, i.secondProperty) FROM ObjectName i WHERE i.id=100";
TypedQuery<CustomObject> typedQuery = em.createQuery(query , CustomObject.class);
List<CustomObject> results = typedQuery.getResultList();CustomObject.class);
Run Code Online (Sandbox Code Playgroud)
要防止类未找到错误,只需插入完整的包名称.假设org.company.directory是CustomObject的包名:
String query = "SELECT NEW org.company.directory.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();
Run Code Online (Sandbox Code Playgroud)
Projections 可用于仅选择实体对象的特定属性(列).
来自文档
Spring Data Repositories通常在使用查询方法时返回域模型.但是,有时,您可能需要根据各种原因更改该模型的视图.在本节中,您将学习如何定义投影以提供简化和简化的资源视图.
仅使用getters您想要的界面定义界面.
interface CustomObject {
String getA(); // Actual property name is A
String getB(); // Actual property name is B
}
Run Code Online (Sandbox Code Playgroud)
现在CustomObject从您的存储库返回,如下所示:
public interface YOU_REPOSITORY_NAME extends JpaRepository<YOUR_ENTITY, Long> {
CustomObject findByObjectName(String name);
}
Run Code Online (Sandbox Code Playgroud)