2013-03-30 45 views
1

我有一個使用JAX-RS,JPA和JAXB的web服務。我已經寫了一個方法,應該從我的數據庫返回一個對象集合。這雖然沒有發生。它只返回一個項目。JAX-RS返回您的自定義對象的集合?

@Entity 
    @NamedQueries({ 
      @NamedQuery(name = "findMeasurementsByRunID", query = "SELECT m " 
        + "FROM Measurement m " 
        + "WHERE m.runID = :runid"), 
      @NamedQuery(name = "findMeasurementsByRunIDPosition", query = "SELECT m " 
        + "FROM Measurement m " 
        + "WHERE m.runID = :runid AND " 
        + "m.position = :position") }) 
    @XmlRootElement 
    @XmlType(propOrder = { "runID", "rack", "position", "completionStatus", 
      "countingTime", "cr51Counts", "cr51CPM", "cr51Error", 
      "measurementDateTime", "protocolID", "protocolName" }) 
    public class Measurement implements Serializable { 
     private static final long serialVersionUID = 1L; 

     @Id 
     @AttributeOverrides({ 
       @AttributeOverride(name = "runID", column = @Column(name = "RunID")), 
       @AttributeOverride(name = "position", column = @Column(name = "Position")) }) 
     @Column(name = "RunID") 
     private int runID; 

     @Column(name = "Rack") 
     private int rack; 

     @Column(name = "Position") 
     private int position; 

     @Column(name = "Completionstatus") 
     private int completionStatus; 

     @Column(name = "CountingTime") 
     private double countingTime; 

     @Column(name = "Cr51Counts") 
     private double cr51Counts; 

     @Column(name = "Cr51CPM") 
     private double cr51CPM; 

     @Column(name = "Cr51Error") 
     private double cr51Error; 

     @Column(name = "MeasurementDateTime") 
     @Temporal(TemporalType.TIMESTAMP) 
     private Date measurementDateTime; 

     @Column(name = "ProtocolID") 
     private int protocolID; 

     @Column(name = "ProtocolName") 
     private String protocolName; 

     public Measurement() { 
     } 

      // Getters and Setters... 
} 

如果我把它只能從查詢作爲XML不是整個集合返回的第一項服務:

我的方法:

@GET 
    @Produces(MediaType.APPLICATION_XML) 
    @Path("findMeasurementsByRunID/{runID}") 
    public List<Measurement> getMeasurementByRunId(@PathParam("runID") int runID) { 
     List<Measurement> results = null; 
     Query query = emf.createEntityManager().createNamedQuery(
       "findMeasurementsByRunID"); 
     query.setParameter("runid", runID); 
     results = query.getResultList(); 
     return results; 
    } 

我的實體類。

輸出:

<measurements> 
    <measurement> 
    <runID>418</runID> 
    <rack>57</rack> 
    <position>1</position> 
    <completionStatus>0</completionStatus> 
    <countingTime>3599.97</countingTime> 
    <cr51Counts>2225.53</cr51Counts> 
    <cr51CPM>5.11</cr51CPM> 
    <cr51Error>44.26</cr51Error> 
    <measurementDateTime>2012-12-14T14:08:37.0</measurementDateTime> 
    <protocolID>3</protocolID> 
    <protocolName>Cr-51 GFR (almindelig blodproever)</protocolName> 
    </measurement> 
</measurements> 

我怎樣才能讓服務回報測量整個集合,而不僅僅是一個項目?

我的數據: enter image description here

回答

0

所以,你執行一些查詢「findMeasurementsByRunID」它限制在特定「的runid」,你不明白,爲什麼你只得到1個測量對象?更新您的查詢以刪除/更改過濾器,以便允許多個過濾器

+0

每個runID有多個條目。關鍵是複合,由runid和位置組成。 – Bohsen

+0

runID是類的「Id」,是的,所以它的PK,那麼每個runID如何存在多行?或者你有一些額外的「Id」字段是祕密的?也許「位置」也應該是PK的一部分?在這種情況下將其標記爲,並定義一個ObjectIdClass。然後返回由您的JPA提供者調用的SQL是什麼 – DataNucleus

+0

感謝您的幫助,現在它可以工作。原來我沒有從我的databaseschema的最新版本創建實體類。 – Bohsen

相關問題