Java 生成的JSON中缺少JPA实体属性名称

Java 生成的JSON中缺少JPA实体属性名称,java,json,jpa,jackson,Java,Json,Jpa,Jackson,我使用JPA,Jackson用于生成JSON Emp.java @Entity @NamedQuery(name = "Emp.findAll", query = "select o.empNo, o.empName from Emp o ") @Table(name = "EMP") public class Emp implements Serializable { @Column(name = "ename") private String empName;

我使用JPA,Jackson用于生成JSON

Emp.java

@Entity
@NamedQuery(name = "Emp.findAll", 
           query = "select o.empNo, o.empName from Emp o ") 
@Table(name = "EMP")
public class Emp implements Serializable {

@Column(name = "ename")
private String empName;

@Id
@Column(name = "empno", nullable = false)
private String empNo;
.....
在服务类中,我有以下代码

@GET
@Path("/emplist")
@Produces(MediaType.APPLICATION_JSON)
public Object getEmployees() {
List<Emp> list = this.findAll();
ObjectMapper objectMapper = new ObjectMapper();
empAsJson = objectMapper.writeValueAsString(list);

public List<Emp> findAll() {
    return getEntityManager().createNamedQuery("Emp.findAll").getResultList();
}
而如果我将Emp类中的namedQuery更改为

select o  from Emp o
然后生成的JSON具有如下所示的属性名称

[{"empNo":"2390","empName":"JAMES"},

这可能是什么原因,我如何解决这个问题?

不同之处在于,在查询
中,从Emp o选择o.empNo,o.empName
您选择特定的实体字段,并且每个结果行都是一个
对象[]
。因此,指定属性的数组


第二个查询
select o from Emp o
选择整个实体及其所有字段,您看到的是JSON marashalled实体。

区别在于,在查询
select o.empNo,o.empName from Emp o
中,您选择了特定的实体字段,每个结果行都是一个
对象[]
。因此,指定属性的数组


第二个查询
selecto from Emp o
选择整个实体及其所有字段,您看到的是JSON marashalled实体。

在第一种情况下,您的JPQL返回一个
列表
;列表中的每个项目都是一个数组,包含
o.empNo
o.empName
的值。当然,当生成JSON时,它将作为一个数组/项目列表生成


在第二种情况下,您会得到一个
列表
,其中每个项目都是
员工
实例,因此它像对象一样被序列化(属性值列表)。

在第一种情况下,您的JPQL返回一个
列表
;列表中的每个项目都是一个数组,包含
o.empNo
o.empName
的值。当然,当生成JSON时,它将作为一个数组/项目列表生成


在第二种情况下,您会得到一个
列表
,其中每个项目都是一个
员工
实例,因此它像对象一样被序列化(属性值列表)。

命名查询
选择o.empNo,o.Emp o
中的empName将
返回列表
,其中as
从Emp o中选择o
返回列表
,因此相应地将生成
json

您可以按如下所示更改查询

从Emp o中选择新Emp(o.empNo,o.empName)
并在类中相应地使用构造函数

或者尝试使用


从Emp o选择新映射(o.empNo作为empNo,o.empName作为empName)
命名查询
从Emp o选择o.empNo,o.empName
返回列表
其中as
从Emp o选择o
返回列表
,因此相应地将生成
json

您可以按如下所示更改查询

从Emp o中选择新Emp(o.empNo,o.empName)
并在类中相应地使用构造函数

或者尝试使用

从Emp o选择新映射(o.empNo作为empNo,o.empName作为empName)

[{"empNo":"2390","empName":"JAMES"},