17

次のマッピングを参照してください

@Entity
public class User {

    private Integer id;

    @Id;
    private Integer getId() {
        return this.id;
    }

}

id は整数であることに注意してください。like演算子を使用して、このHQLクエリが必要です

Query query = sessionFactory.getCurrentSession().createQuery("from User u where u.id like :userId");

ATT: IT IS like operator NOT = (equals operator)

それから私は使用します

List<User> userList = query.setParameter("userId", userId + "%").list();

しかし、Hibernate が User.id の getter を呼び出して IllegalArgumentException が発生したと不平を言うため、機能しません。

使うときも

query.setString("userId", userId + "%");

それは動作しません

クエリを渡すには何を使用すればよいですか?

4

2 に答える 2

30

休止状態のリファレンスによると:

str() は、数値または時間値を読み取り可能な文字列に変換するために使用されます

だから私が使うとき

from User u where str(u.id) like :userId

それは正常に動作します

于 2009-12-14T19:06:28.340 に答える
7

通常、LIKE 演算子はテキスト データ、つまり VARCHAR または CHAR 列で使用され、数値id列 (INTEGER) があります。

フィールドを文字列としてマップidし、そのフィールドをクエリで使用することもできます。これは、データベース エンジンによっては機能する場合と機能しない場合があります。経由ですべての更新を処理し、フィールドを読み取り専用setId()と見なす必要があることに注意してください。idAsString

@実在物
パブリック クラス ユーザー {

    プライベート整数 ID;
    プライベート文字列 idAsString;

    @ID;
    プライベート整数 getId() {
        this.id を返します。
    }

    プライベートボイドsetId(整数ID){
        this.id = id;
    }

    @Column(name="id", 挿入可能=false, 更新可能=false)
    プライベート文字列 getIdAsString() {
       this.idAsString を返します。
    }

    プライベート ボイド setIdAsString(文字列 idAsString) {
       this.idAsString = idAsString;
    }
}

次に、クエリは次のようになります。

Query query = sessionFactory.getCurrentSession().createQuery("from User u where u.idAsString like :userId");
List<User> userList = query.setParameter("userId", userId + "%").list();
于 2009-12-14T18:56:39.060 に答える