Projections可用于仅选择实体对象的特定属性(列)。 从文件上看 Spring Data Repositories通常在使用查询方法时返回域模型。然而,有时,您可能需要出于各种原因更改该模型的视图。在本节中,您将学习如何定义投影以提供简化和简化的资源视图。 定义一个只包含所需getters的接口。
interface CustomObject {
String getA(); // Actual property name is A
String getB(); // Actual property name is B
}
是的,这是可能的。您所要做的就是将查询更改为类似SELECT i.foo, i.bar FROM ObjectName i WHERE i.id = 10的内容。查询的结果将是Object数组的List。每个数组中的第一个元素是i.foo的值,第二个元素是i.bar的值。请参阅JPQL参考的相关部分。
7条答案
按热度按时间pjngdqdw1#
是的,就像在普通SQL中一样,你可以指定你想要选择的属性类型:
执行此查询将返回Object[]的列表,其中每个数组包含一个对象的选定属性。
另一种方法是将选定的属性 Package 在自定义对象中,并在TypedQuery中执行:
例子可以在this文章中找到。
更新29.03.2018:
@Krish:
@PatrickLeitermann对我来说它的给予“引起:org.hibernate.hql.internal.ast.QuerySyntaxException:找不到类***”异常,如何解决?
我猜你是在Spring应用程序的上下文中使用JPA的,不是吗?有些人使用的正是the same problem,他们的解决方案是在SELECT NEW关键字后添加完全限定名(例如. com.example.CustomObject)。
也许Spring Data 框架的内部实现只识别用 @Entity 注解的类,或者通过它们的简单名称在特定orm文件中注册的类,这导致使用此解决方案。
jdgnovmf2#
你可以使用类似这样的东西:
然后你可以迭代它:
但是如果你在查询中只有一个字段,你得到的列表类型不是Object[]
z5btuh9x3#
Projections
可用于仅选择实体对象的特定属性(列)。从文件上看
Spring Data Repositories通常在使用查询方法时返回域模型。然而,有时,您可能需要出于各种原因更改该模型的视图。在本节中,您将学习如何定义投影以提供简化和简化的资源视图。
定义一个只包含所需
getters
的接口。现在从仓库返回
CustomObject
,如下所示:falq053o4#
很好的答案!我有一个小补充。关于这个解决方案:
为了防止出现找不到类的错误,只需插入完整的软件包名称。假设org.company.directory是CustomObject的软件包名称:
ny6fqffe5#
我想你可以看看这个链接,如果我理解你的问题正确http://www.javacodegeeks.com/2012/07/ultimate-jpa-queries-and-tips-list-part_09.html
例如,他们创建了一个查询:
0vvn1miw6#
是的,这是可能的。您所要做的就是将查询更改为类似
SELECT i.foo, i.bar FROM ObjectName i WHERE i.id = 10
的内容。查询的结果将是Object
数组的List
。每个数组中的第一个元素是i.foo
的值,第二个元素是i.bar
的值。请参阅JPQL参考的相关部分。wpcxdonn7#
我也遇到了同样的问题。我有一个
users
表,其中有一个id
列(主键)和一个name
列。我想获取所有记录的name
字段,所以我尝试了findName
和findNames
,但都不起作用。我的解决方案是在实体类中创建一个只有
getName()
方法的接口:然后在我的JPA存储库中使用“id not null”作为过滤器: