Имена атрибутов сущности JPA отсутствуют в сгенерированном JSON

Я использую JPA и Джексон используется для генерации 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"],

Принимая во внимание, что если я изменю namedQuery в классе Emp на

select o  from Emp o

затем сгенерированный JSON имеет имена атрибутов, как показано ниже

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

В чем может быть причина этого и как я могу решить эту проблему?

3 ответа

Решение

NAmed Query select o.empNo, o.empName from Emp o будут return List<Object[]> в то время как select o from Emp o будут return List<Emp>соответственно 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

Разница в том, что в запросе select o.empNo, o.empName from Emp o Вы выбираете конкретные поля сущностей, и каждая строка результата является Object[], Таким образом, этот массив указанных свойств.

Второй запрос select o from Emp o выбирает всю сущность со всеми ее полями, и то, что вы видите, является сущностью в формате JSON.

В первом случае ваш JPQL возвращает List<Object[]>; каждый элемент в списке представляет собой массив, содержащий значения o.empNo а также o.empName, Конечно, когда создается JSON, он создается как массив / список элементов.

Во втором случае вы получите List<Employee>каждый элемент которого является Employee экземпляр, поэтому он сериализуется, как объект (список значений атрибутов).

Другие вопросы по тегам