2011-03-02 120 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