我正在使用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"},
可能是什么原因以及如何解决此问题?
答案 0 :(得分:3)
NAmed查询select o.empNo, o.empName from Emp o
将return List<Object[]>
select o from Emp o
将return 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.empNo
和o.empName
值的数组。当然,当生成JSON时,它将作为数组/项列表生成。
在第二种情况下,你得到一个List<Employee>
,每个项目都是一个Employee
实例,所以它被序列化为一个对象(属性值列表)。