【问题标题】:JPA Entity attribute names missing in generated JSON生成的 JSON 中缺少 JPA 实体属性名称
【发布时间】:2014-12-15 11:16:54
【问题描述】:

我正在使用 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();
}

问题是生成的 JSON 没有属性名称,例如

["2390","JAMES"],

而如果我将 Emp 类中的 namedQuery 更改为

select o  from Emp o

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

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

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

【问题讨论】:

    标签: java json jpa jackson


    【解决方案1】:

    命名查询select o.empNo, o.empName from Emp oreturn List&lt;Object[]&gt; 其中select o from Emp oreturn List&lt;Emp&gt;,因此将相应地生成json

    您可以如下更改查询

    select new Emp(o.empNo, o.empName) from Emp o 并相应地在您的类中有一个构造函数。

    或尝试使用

    select new Map(o.empNo as empNo , o.empName as empName) from Emp o

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        在第一种情况下,您的 JPQL 返回 List&lt;Object[]&gt;;列表中的每一项都是一个包含o.empNoo.empName 值的数组。当然,在生成 JSON 时,它会生成为一个数组/项列表。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-08-18
          • 2013-09-08
          • 2016-01-09
          • 1970-01-01
          相关资源
          最近更新 更多