web-dev-qa-db-ja.com

like演算子を使用したHibernate HQLクエリ

次のマッピングをSEU

@Entity
public class User {

    private Integer id;

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

}

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

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

ATT:IT IS like演算子NOT =(等しい演算子)

それから私は使用します

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

しかし、HibernateがIllegalArgumentExceptionがUser.idのgetterを呼び出して発生したと文句を言うので機能しません

使っても

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

それは動作しません

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

16
Arthur Ronald

Hibernateリファレンスによると:

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

だから私が使うとき

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

うまくいきます

29
Arthur Ronald

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

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

 @ Entity 
 public class User {
 
 private Integer id; 
 private String idAsString; 
 
 @ Id; 
 private Integer getId(){
 return this.id; 
} 
 
 private void setId(Integer id){
 this.id = id; 
} 
 
 @Column(name = "id"、insertable = false、updatable = false)
 private String getIdAsString( ){
 return this.idAsString; 
} 
 
 private void setIdAsString(String 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();
7
Juha Syrjälä