2011-03-02 187 views
1

你好,请原谅我的英语!JAXB + JPA + JAX-RS,JAXB注释问题

假设我有这个实体,这个namedquery使用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; 
    } 

现在的问题是在编组期间因为没有为name字段一个@XmlRootElement注释。 只有在执行了namedquery Person.selectName时,我才会输出像<Persons><Person><name>value1</name></Person><Person><name>value2</name></Person>而不包含<surname>标记。而且我不能使用@XmlTransient,因为namedquery“selectAll”需要那个。 如何以“优雅的方式”解决?

回答

0

您可以在surname属性上使用JAXB @XmlTransient注释,而不影响JPA命名查询的工作方式。

@Column 
@XmlTransient 
private String surname; 

UPDATE

您可以通过创建一个新的类,PERSONNAME解决这个问题。这个类只有你想用JAXB映射的字段。该类将由getList()方法返回,并且在该方法中,您将需要将列表< Person>转换为列表< PersonName>。

如果您正在使用EclipseLink作为JPA提供者,那么你也可以做到以下几点:

+0

随着@XmlTransient注释当我执行namedquery “Person.selectAll” 的XML输出不包含''标签。 – raid3n 2011-03-02 20:24:52

+0

我以为你想要排除姓氏标签。您的问题指出“没有标签”。 – 2011-03-02 20:38:18

+0

你是对的。我编辑了我的问题。谢谢。 – raid3n 2011-03-02 20:43:33