JAXB + JPA + JAX-RS, JAXB Проблема аннотации - PullRequest
1 голос
/ 02 марта 2011

Здравствуйте и извините за мой английский!

Предположим, у меня есть этот объект с этим именованным запросом, который выбирает столбец имени с аннотациями jaxb.

@Entity
@NamedQueries({
        @NamedQuery(name = "Person.selectAll", query = "SELECT p FROM Form p"),
        @NamedQuery(name = "Person.selectName", query = "SELECT p.id,p.name FROM Form p"),
});
@XmlRootElement
public class Person implements Serializable {

    @Id
    @Column
    private int id;

    @XmlElement
    private String name;

    @Column
    @XmlElement
    private String surname;
    ..
}

Предположим, теперь у меня есть метод Rest, которыйвыполняет namedquery Person.selectName и возвращает код ответа XML или JSON.

@GET
    @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
    @Path("/list")
    public List<Person> getList()
    {
        //here i execute the namedquery Person.selectName
        List<Person> persons = executeNamedQuery().getList();    
        return persons;
    }

Теперь проблема заключается в сортировке, поскольку для поля имени нет аннотации @XmlRootElement.Я хотел бы выводить как <Persons><Person><name>value1</name></Person><Person><name>value2</name></Person> без тегов <surname> только при выполнении именованного запроса Person.selectName.И я не могу использовать @XmlTransient, потому что именованный запрос «selectAll» этого хочет.Как решить в "элегантной манере"?

1 Ответ

0 голосов
/ 02 марта 2011

Вы можете использовать аннотацию JAXB @XmlTransient для свойства фамилии, не влияя на работу именованного запроса JPA.

@Column
@XmlTransient
private String surname;

UPDATE

Вы можете решить эту проблему, создав новый класс PersonName. Этот класс будет иметь только те поля, которые вы хотите сопоставить с JAXB. Этот класс будет возвращен методом getList (), и в этом методе вам нужно будет преобразовать List в List .

Если вы используете EclipseLink в качестве поставщика JPA, вы также можете сделать следующее:

...