2009-11-12 10 views
25

Hibernate基準に問題があります。私は、クエリが返すクラスのメンバオブジェクトのidを見るCriteriaを作成しようとしています。例えばJava/Hibernate:ネストされたオブジェクト基準でプロパティを解決できませんでした


org.hibernate.QueryException: could not resolve property: lecture.admin.id of: xxx.yyy.Enquiry

Enquiryクラスが順番に管理変数が含まれている講義の変数を、含んでいます:

Criteria crit = session.createCriteria(Enquiry.class); 
crit.add(Expression.eq("lecture.admin.id", userId));` 

この結果は例外です。私はlecture.idを使ってみましたが、うまくいきます。

このようなオブジェクト階層を下に行くことができるレベルの数に制限はありますか?

ありがとうございます!

コードスニペット:

public class Lecture extends TransferItem { 
    private User admin; 
    public User getAdmin() { 
    return admin; 
    } 
} 

'ユーザー' クラスが順番にgetId()方法を持っているItemクラスを拡張Personクラス、拡張:HibernateマッピングXMLから

public Integer getId() { 
    if (id != null) { 
    return id; 
    } 
    return TransferBean.NOT_SET; 
} 

を:

<class name="User" table="user"> 
    <id column="user_id" name="id"> 
    <generator class="increment"/> 
    </id> 
    ... 

<class name="Lecture" table="lecture"> 
    <many-to-one class="User" column="user_fk" lazy="false" name="admin"/>` 

user表:あなたがダウンしてオブジェクトグラフで深すぎる行くとき

mysql> show columns from user; 
+-----------------+--------------+------+-----+---------+-------+ 
| Field   | Type   | Null | Key | Default | Extra | 
+-----------------+--------------+------+-----+---------+-------+ 
| user_id   | int(11)  | NO | PRI |   |  | 
| firstname  | varchar(50) | YES |  | NULL |  | 
| lastname  | varchar(50) | YES |  | NULL |  | 
| signature  | varchar(16) | YES |  | NULL |  | 
| email_signature | varchar(256) | YES |  | NULL |  | 
| password  | varchar(32) | YES |  | NULL |  | 
| phone   | varchar(16) | YES |  | NULL |  | 
| email   | varchar(255) | YES | UNI | NULL |  | 
| lecturer_fk  | int(11)  | YES | MUL | NULL |  | 
| access   | int(11)  | YES |  | NULL |  | 
| deleted   | tinyint(1) | YES |  | NULL |  | 
+-----------------+--------------+------+-----+---------+-------+ 
11 rows in set (0.02 sec)` 

答えて

68

HQLとは異なり、ネストしたパスをCriteria APIで直接使用することはできません。代わりに、ネストされた基準のインスタンスを作成したり、最初の非ルートエンティティから始まる各「entity.property」ペアに別名を定義する必要があります。

Criteria criteria = session.createCriteria(Enquiry.class) 
.createAlias("lecture", "l") 
.createAlias("l.admin", "a") 
.add(Restrictions.eqProperty("a.id", userId)); 

それはに属しているように非常に最初のプロパティが接頭辞でないことに注意してくださいルートエンティティ(Enquiry)、その他には前のレベルのエイリアスが前置されています。詳細はin the documentationです。

また、idはアソシエーションに関しては特別なプロパティです。あなたの場合user_fklectureテーブルにある列です。

Criteria criteria = session.createCriteria(Enquiry.class) 
.createAlias("lecture", "l") 
.add(Restrictions.eqProperty("l.admin.id", userId)); 

は、このように余分に参加排除:それは、したがって、上記のような基準を書き換えること(あなたが投稿したマッピングが正確であることを提供する)ことが可能なはずです。

+0

ああ、非常に良い点。 – Henning

+0

いつものように常に教えてください@ ChssPly76 –

+0

これは美しく動作します。助けてくれてありがとう。 – Malakim

2
Criteria crit = session.createCriteria(Enquiry.class) 
crit.createAlias("lecture.admin", "lectureAdmin"); 
crit.add(Expression.eq("lectureAdmin.id", userId)); 

あなたは確かに問題を打つことができます。私は通常、上記のようにエイリアスを作成することでこれを回避します。

+1

私はこれを試してみましたが、私は、代わりにSQLGrammarExceptionを打つ:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:によって引き起こさ を未知の列には、「where句」 任意のアイデアで「lectureadm1_.user_id」? – Malakim

+0

これは、 "user"テーブルに "user_id"カラムがないというデータベースからのエラーのようです。データベーステーブルにこの列があることは確かですか?おそらくデータベースの列は "id"とも呼ばれ、休止状態の場合はマッピングが問題になります。 –

+0

質問にユーザデータベーステーブルを追加しました ありがとう! – Malakim

関連する問題