2

这是长篇。我正在开发 Restful Web 服务以使用 jersey、Hibernate 生成 JSON 数据,数据库是 MySQL。我一直在使用 Hibernate 并在我的项目中使用所有 native-sql 来与数据库通信。

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

模式 1

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

  1. 工作 ----- 1 到多个 --->
  2. 活动 工作 ----- 一对多---> 俱乐部
  3. 事件 ----- 1 到多个 ---> 条目
  4. 俱乐部---------->参赛作品(一对多)

模式 2

表:工作、事件、俱乐部、比赛、结果、拆分

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

  2. 事件----->比赛(一对多)

  3. 比赛 ------> 结果(一对多)

  4. 俱乐部---------->参赛作品(一对多)

  5. 结果------>Splits (one to many) 也有热切映射

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

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

我必须从结果中获取结果数据(也拆分急切映射的数据),从模式 2 中拆分表以及从模式 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 提要的期望是:

{ "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}..]** ]}

有没有人遇到过类似的情况,有没有解决办法。

附言

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

先感谢您。

4

0 回答 0