2013-06-14 13 views
21

SQLクエリで指定された_(アンダースコア)は受け入れられません。hibernateとSQLの文字列クエリでアンダースコアをエスケープする方法は?

例:

SELECT * FROM employee WHERE NAME LIKE '%k_p%'; 

これが一致したとHibernateにもk_p

誰かがSQLでこれを達成するためにどのように支援してもらえ含む行から離れて多くの行をもたらすと?ありがとう。

SELECT * FROM employee WHERE NAME LIKE '%k\_p%'; 

\_だけではなく_を:

+0

[ESCAPE文字](http://dev.mysql.com/doc/refman/5.5/en/string-comparison-functions.html#operator_like)を指定することができます。たとえば、LIKE '%k | _p%' ESCAPE '|' 。 – wisefish

答えて

48

は、あなたがそれを脱出しようとしています。 MySQLのソリューションで

+0

+1シンプルでわかりやすい –

0

List<UserDTO> userDTOList = signUpBusiness.getUserDTODetails("k", "p"); 

コールこの方法

public List<UserDTO> getUserDTODetails(String firstMatch, String secondMatch) { 
    List<UserDTO> userDTOList = new ArrayList<UserDTO>(); 
    Session session = null; 
    try { 
     session = SessionFactoryFpf.getCurrentSession(); 
     Criteria criteria = session.createCriteria(User.class); 
     //MatchMode matchMode = MatchMode.ANYWHERE; 
     //criteria.add(Restrictions.like("id", firstMatch, matchMode)); 
     criteria.add(Restrictions.like("id", "%"+firstMatch+"_"+secondMatch+"%")); 
     List<User> userList = criteria.list(); 
     if (userList.size() > 0) { 
      for (User user : userList) { 
       UserDTO userDTO = new UserDTO(); 
       userDTO.setId(user.getId()); 
       userDTO.setDob(user.getDob()); 
       userDTO.setFullName(user.getFullName()); 
       userDTO.setGender(user.getGender()); 
       userDTO.setEmail(user.getEmail()); 
       userDTOList.add(userDTO); 
      } 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
     LOG.error("Type of exception occured in getUserDTODetails() is --> "+e); 
    } finally { 
     SessionFactoryFpf.closeSession(session); 
    } 
    return userDTOList; 
} 

もう一つの方法は、上記の方法でコメントを切り替える:select * from users where id like '%k_p%';

In Hibernate 

ここでは解決策があります

MatchMode matchMode = MatchMode.ANYWHERE; 
criteria.add(Restrictions.like("id", firstMatch, matchMode)); 
//criteria.add(Restrictions.like("id", "%"+firstMatch+"_"+secondMatch+"%")); 
+0

あなたのMySQLの解決策は間違っているようです - あなたはアンダースコアをマイナス(typo?)に置き換えました。また、マイナスの代わりにアンダースコアを使用すると、_はSQLのようなクエリのワイルドカードなので、誤検出が発生します。 –

+0

@FrankSchmittの回答が更新されました – pudaykiran

関連する問題