Hibernate Eager加载(多对一),Jersey Rest生成JSON

时间:2012-10-01 04:20:00

标签: hibernate jersey

这很长。 我正在开发Restful Web Services以使用jersey生成JSON数据,Hibernate和数据库是MySQL。 我一直在使用Hibernate并且在我的项目中做了所有native-sql来与数据库进行通信。

我在数据库中有2个模式,并且有各自的实体类,

架构1

表:工作,活动,俱乐部,条目

  1. 工作----- 1对多--->
  2. 活动工作----- 1到多个--->俱乐部
  3. 活动----- 1到多个--->条目
  4. 分会---------->参赛作品(一对多)
  5. 架构2

    表:工作,活动,俱乐部,种族,结果,分裂

    1. 工作机会---->活动,俱乐部(一对多)

    2. 事件------>种族(一对多)

    3. 种族------>结果(一对多)

    4. 分会---------->参赛作品(一对多)

    5. 结果------>分裂(一对多)也急切映射

    6. Schema 2中的所有表都具有与Schema 1表匹配的键,例如: Schema 2 Jobs具有schema1.job_id,Schema 2事件具有schema 1.event_id键。 为简单起见,我们可以使用Schema_1 / Schema_2表键从Schema_2 / Schema_1表中访问数据

      我有从两个数据库返回数据的所有端点。我一直在做跨模式查询。到目前为止做得很好而没有遇到重大麻烦。但我对此问题感到震惊。

      我必须从Schema 2的Results,Splits表以及Schema 1的事件,俱乐部,条目信息中获取结果数据(也分割急切映射的数据)。我无法做到这一点。

      Results.java(实体)

        @XmlRootElement
        @Entity
        @Table(name = "results", catalog = "schema2")
        public class Results implements java.io.Serializable {
      
      private BigDecimal id;
      private Set<Splits> splits = new HashSet<Splits>(0);
      /* some more fields*/
      
      //getters and setters
      
          @XmlID
          @XmlJavaTypeAdapter(IDAdapter.class)
          @JsonProperty("resultId")
          @Id
          @Column(name = "Id", unique = true, nullable = false, precision = 12, scale = 6)
          public BigDecimal getId() {
              return this.id;
      
          @OneToMany(fetch=FetchType.EAGER, mappedBy="result", cascade= CascadeType.ALL)
          public Set<Splits> getSplits() {
              return splits;
          }
      
          public void setSplits(Set<Splits> splits) {
              this.splits = splits;
          }
      
          public void setId(BigDecimal id) {
              this.id = id;
          }
      
      }
      

      Splits.java(实体类)

      private BigDecimal id;
      private Results result;
      
         // Property accessors
      @Id
      @Column(name = "Id", unique = true, nullable = false, precision = 12, scale = 6)
      public BigDecimal getId() {
          return this.id;
      }
      
      public void setId(BigDecimal id) {
          this.id = id;
      }
      
      
      @JsonIgnore
      @XmlIDREF
      @ManyToOne(fetch=FetchType.EAGER)
      @JoinColumn(name="Pid",nullable=false,insertable=false,updatable=false)
      public Results getResult() {
          return result;
      }
      
      public void setResult(Results result) {
          this.result = result;
      

      在我的Dao中,我一直在使用Hibernate

      进行本机sql查询
       String sql=   "SELECT c1.organization, group_concat(c1.short_name separator     '/'),e1.event_description, res2.* FROM Schema_2.results res2 
          left outer join Schema_2.splits s2 on (s2.pid=res2.id)  
          left outer join Schema_2.races ra2 on(res2.pid=ra2.id) 
          join Schema_2.events e2 on(ra2.pid=e2.id) 
          left outer join Schema_2.entries en2 on (res2.entrypid=en2.id) 
          left outer join Schema_2.clubs c2 on(en2.pid=c2.id) 
          left outer join Schema_1.clubs c1 on (c1.org_id=c2.regOrgId)  
          left outer join Schema_1.events e1 on (e1.event_id=e2.regeventId)
          where res2.rmrsid=:jobId and en.entryStatus='Entered' 
          and e2.regEventId=:eventId group by en2.entryId order by res2.finishPlace";
                  Query query=session.createSQLQuery(sql)
          .addEntity("res2",Schema_2.Results.class)
          .addEntity("c1" ,Schema_1.Clubs.class)
          .addEntity("e1",Schema_1.Events.class)
          .setParameter("jobId", jobId).setParameter("eventId", eventId);
      
                    resultList=query.list();
                    tx.commit();
      

      我在Json Feed中的期望是:

      { "success":true, "count":some number,"msg":"","data":[ "organization":"ABC","eventDescription":"Event 1", **"resultNo":1,"resultTime":"8:30","ResultFinishTime":"xxxxx","splits":[{splits1 data},{splits2 data},{ splits 3 data}..]** ]}
      

      但我遇到了错误:

      java.sql.SQLException:找不到列

      当我只选择具有相同查询的res2。*和addEntity(“res2”,Schema_2.Results.class)时

      我没有问题,从结果中获取数据以及急切加载分割数据,如此

      { "success":true, "count":some number,"msg":"","data":[**"resultNo":1,"resultTime":"8:30","ResultFinishTime":"xxxxx","splits":[{splits1 data},{splits2 data},{ splits 3 data}..]** ]}
      

      是否有人遇到类似的情况,有没有解决此问题。

      P.S

      当使用Transformer,EntityToBean或EntityToMap时,子集合(Splits)包含在我的数据集中,除了分割数据外,我得到所有数据。

      提前谢谢。

0 个答案:

没有答案