Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带有显式自定义类的getNamedQuery_Java_Sql_Jpa_Named Query - Fatal编程技术网

Java 带有显式自定义类的getNamedQuery

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

假设我有一个Person模型(Java类和数据库表),其中包含诸如姓名、年龄、性别、身高、体重等列/字段

现在有两种可能性

1) 我需要整个列数据..因此我需要命名查询 as

@NamedQuery(name=“Person.findAll”,query=“从Person中选择p 在哪里……”

2) 我只需要特定的列数据..因此我将命名查询作为

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实体混淆。