3

2 つのデータベース テーブルがあり、Hibernate を使用して 2 つの間に多対 1 の関係を設定したいと考えています。

ここに画像の説明を入力

と

これら 2 つのテーブルは作成しませんでしたが、プロジェクトを開始したときに既に作成されていました。私は Hibernate を初めて使用し、2 つのテーブル間で ManyToOne の関係を作成したいと考えています。

これは通常は簡単なことですが、2 つのテーブル間のリンク「Praxiscode」は主キーではなく、次のようなことをしたいと思います。

@ManyToOne(targetEntity = PraxisIITest.class)
    @Fetch(FetchMode.JOIN)
    @NotFound(action = NotFoundAction.IGNORE)
    @Formula(value = "(SELECT praxis.ID FROM lstPraxis praxis where praxis.Praxiscode=Praxiscode and Testdate BETWEEN praxis.BeginDate AND praxis.EndDate)")
    private PraxisIITest praxisIITest;

ただし、上記の @Formula を指定すると、列が「フィールド リスト」にないことを訴える例外がスローされます。

org.hibernate.exception.SQLGrammarException: Unknown column 'praxisiite1_.praxisIITest_ID' in 'field list'
    org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:82)

PraxisIITest で ID を指定する場所はこちら ->

@Entity
@Table(name="lstPraxis")
@Cache(region="edu.uky.cepis.cache.praxisIItest", usage=CacheConcurrencyStrategy.READ_WRITE)
public class PraxisIITest implements java.util.Comparator<PraxisIITest>, Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="ID")
    private long id;

私はこれについてすべて間違っていますか?または、非常に基本的なものが欠けているのでしょうか。私の理解では、これでうまくいくはずです...

どんな考えやアドバイスも大歓迎です!よろしくお願いします!

4

1 に答える 1

0

問題は、有効な SQL フラグメントを使用していないことだと思います。Hibernate が何らかのエイリアシングを行うことを前提としています。

(SELECT praxis.ID FROM lstPraxis praxis where praxis.Praxiscode=Praxiscode and Testdate BETWEEN praxis.BeginDate AND praxis.EndDate)

Testdate は lstPraxis テーブルに存在しません (画像によると)、tbl20Praxis テーブルにあります。そのテーブルが PraxisIITest エンティティのマッピング先である場合でも、@Formula フラグメントで明示的にテーブル結合を行う必要があると思います。

私は、Hibernate が数式を処理して、代わりにネイティブ SQL として扱っているとは思いませんでした。しかし、それはあなたが見ているエラーをさらに混乱させます...

于 2012-09-07T16:17:44.257 に答える