2

これは長いものです。jersey、Hibernate、およびデータベースを使用して JSON データを生成するための Restful Web サービスを開発しています。MySQL です。私はHibernateを使用しており、プロジェクトですべてのnative-sqlを実行してデータベースと通信しています。

データベースに 2 つのスキーマがあり、それぞれのエンティティ クラスがあります。

スキーマ 1

テーブル:ジョブ、イベント、クラブ、エントリ

  1. ジョブ --- 1 対多 --->
  2. イベント ジョブ --- 1 対多 ---> クラブ
  3. イベント --- 1 対多 ---> エントリ
  4. クラブ---------->エントリ (1 対多)

スキーマ 2

テーブル: ジョブ、イベント、クラブ、レース、結果、スプリット

  1. 仕事---->イベント、クラブ(1対多)

  2. イベント ------> レース (1 対多)

  3. レース ------> 結果 (1 対多)

  4. クラブ---------->エントリ (1 対多)

  5. 結果 ------> 分割 (1 対多) また熱心にマッピングされています

スキーマ 2 のすべてのテーブルには、スキーマ 1 テーブルに一致するキーがあります。たとえば、スキーマ 2 ジョブには schema1.job_id があり、スキーマ 2 イベントにはスキーマ 1.event_id キーがあります。簡単にするために、Schema_1/Schema_2 テーブル キーを使用して Schema_2/Schema_1 テーブルのデータにアクセスできます。

両方のデータベースからデータを返すすべてのエンドポイントがあります。私はクロススキーマクエリを行っています。そして、大きなトラブルもなくここまで順調に進んでいます。しかし、私はこの問題に悩まされています。

スキーマ 1 からのイベント、クラブ、エントリ情報とともに、スキーマ 2 からの結果、分割テーブルから結果データ (熱心にマップされている分割データも) を取得する必要があります。私はこれを達成することができません。

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: 列が見つかりません

同じクエリと addEntity("res2",Schema_2.Results.class) で res2.* のみを選択した場合

問題はなく、結果からデータを取得するだけでなく、このような熱心にロードされた分割データも取得します

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

同様の状況に遭遇した人はいますか、これに対する回避策はありますか。

PS

Transformer 、 EntityToBean または EntityToMap を使用すると、子コレクション (分割) がデータ セットに含まれます。分割データを除くすべてのデータを取得します。

前もって感謝します。

4

0 に答える 0