Java 带有显式自定义类的getNamedQuery
假设我有一个Person模型(Java类和数据库表),其中包含诸如姓名、年龄、性别、身高、体重等列/字段 现在有两种可能性 1) 我需要整个列数据..因此我需要命名查询 as @NamedQuery(name=“Person.findAll”,query=“从Person中选择p 在哪里……” 2) 我只需要特定的列数据..因此我将命名查询作为Java 带有显式自定义类的getNamedQuery,java,sql,jpa,named-query,Java,Sql,Jpa,Named Query,假设我有一个Person模型(Java类和数据库表),其中包含诸如姓名、年龄、性别、身高、体重等列/字段 现在有两种可能性 1) 我需要整个列数据..因此我需要命名查询 as @NamedQuery(name=“Person.findAll”,query=“从Person中选择p 在哪里……” 2) 我只需要特定的列数据..因此我将命名查询作为 Query query = getNamedQuery("Person.findAll"); @NamedQuery(name=“Person.fin
Query query = getNamedQuery("Person.findAll");
@NamedQuery(name=“Person.findSpecific”,query=“Select p.name,
p、 年龄来自于某人,在那里……”
在第一种情况下,如果我调用/执行命名查询为
Query query = getNamedQuery("Person.findAll");
它会自动将响应映射到Person Java类。但是在第二种情况下(特定列),它不会。它将响应显示为带有对象数组的向量
我的问题是,当我使用特定的列查询时,是否有任何明确的方法使查询响应自动映射到我的自定义类
我已经试过了
Query query = getNamedQuery("Person.findSpecific",Person.class);
但这同样不会将其映射到Person类。您可以在任何JPA查询的select子句中使用:
select new my.app.PersonView(p.name, p.age) from Person p ...
在这种情况下,将为结果中的每一行创建一个新的PersonView
实例
请注意,此实例未连接到数据源(它们未被管理),因此您将无法通过修改实例来更改基础数据
这就是为什么我建议不要在构造函数表达式中使用实体类,以免将它们与“真实”实体混淆。而是编写只携带数据的自定义“传输对象”。每个投影可以有一个定制的类,或者(如果需要在同一实体上有多个不同的投影)一个更大的类和多个正在使用的构造函数d表示所有投影。在这种情况下,某些字段将始终为空。只是猜测,但您可能需要使用大写的列名称,但这样会得到不完整的Person对象。这就是您想要的吗?是的,我只需要在UI上显示select列值。这样就可以了。@user2310289:列名已经映射好了properly@testndtv则不应使用Person,而应使用一个单独的类,该类仅包含所需的列。请参见下面的答案。因此,如果我需要多个列组合才能返回…我是否需要为每个组合创建新类?这取决于(通常情况下)。如果您只有两个或三个投影,请考虑自定义类。如果您有真正不同的组合(例如名称+年龄、名称+城市、城市+年龄,…)编写一个用于所有人的自定义类,并对其进行记录,这样就可以清楚地看到,并非所有属性都将在每个查询中设置。但我建议不要在构造函数表达式中使用Person类本身,以免将它们与真实的Person实体混淆。