生成的JSON中缺少JPA Entity属性名称

时间:2014-12-15 11:16:55

标签: 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;

@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"],

然而,如果我将Emplass中的namedQuery更改为

select o  from Emp o

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

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

可能是什么原因以及如何解决此问题?

3 个答案:

答案 0 :(得分:3)

NAmed查询select o.empNo, o.empName from Emp oreturn List<Object[]> select o from Emp oreturn List<Emp>,因此json将会生成。{/ p>

您可以按以下方式更改查询

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

或尝试使用

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

在第二种情况下,你得到一个List<Employee>,每个项目都是一个Employee实例,所以它被序列化为一个对象(属性值列表)。