2012-08-15 51 views
5

Tôi có một truy vấn SQL Hibernate như thế này:Cách thực hiện truy vấn Hibernate bằng cách sử dụng like và%?

public void funcA(String str) { 
    StringBuilder sql = new StringBuilder(); 
    sql.append("select fieldA from tableA where fieldB like '%:searchKey%'"); 

    ... 

    session.createSQLQuery(sql.toString()) 
    .addScalar("fieldA", StandardBasicTypes.STRING) 
    .setParameter("searchKey", str); 

    ... 
} 

khi tôi thực hiện một truy vấn như query.list() này, tôi đã lỗi sau:

[WARNING ] SQL Error: -7, SQLState: 42601[ERROR ] The character "%" following "fieldB like" is not valid. 
[ERROR ] An error occurred during implicit system action type "2". Information returned for the error includes SQLCODE "-7", SQLSTATE "42601" and message tokens "%|fieldB like". 

Tôi có thể biết làm thế nào tôi có thể giải quyết vấn đề này?

Trả lời

12

này nên làm việc:

public void funcA(String str) { 
    StringBuilder sql = new StringBuilder(); 
    sql.append("select fieldA from tableA where fieldB like :searchKey"); 

    ... 

    session.createSQLQuery(sql.toString()) 
    .addScalar("fieldA", StandardBasicTypes.STRING) 
    .setParameter("searchKey", "%" + str + "%"); 

    ... 
} 
+0

Điều gì sẽ xảy ra nếu fieldA là Dài hoặc không phải là chuỗi? Sau đó, hibernate không thích chuỗi. Tôi vẫn muốn làm một trận đấu "mờ" (ví dụ: chứa sử dụng %%) nhưng cột là Long. Mysql truy vấn là tốt với điều này, nhưng nó không có vẻ là hibernate được. –

3

Đối với chúng tôi làm việc này ...

whereCluase += " and lower(" + firstAttribute + ") like ?"; 
    queryParams.add("%" + value.toLowerCase() + "%"); 

Xin lỗi vì đăng một đoạn mã nhỏ. Nhưng điều này là đủ để giúp bạn thoát khỏi rắc rối.

EDIT: từ nhận xét, lowertoLowerCase() là để triển khai tính nhạy cảm trong trường hợp tại đây.

+0

+1 Lưu ý tất cả các thứ e 'lower()'/'toLowerCase()' chỉ là một ví dụ làm thế nào để khớp với phân biệt chữ hoa chữ thường. Nó không cần thiết trong trường hợp này. –

2

Trong ví dụ này, tôi đã sử dụng MatchMode (class độ hibernate, để đối phó với những hạn chế ngữ tương tự).

public void funcA(String str) { 
    StringBuilder sql = new StringBuilder(); 
    sql.append("select fieldA from tableA where fieldB like :searchKey"); 

    ... 
    session.createSQLQuery(sql.toString()) 
    .addScalar("fieldA", StandardBasicTypes.STRING) 
    .setParameter("searchKey", MatchMode.ANYWHERE.toMatchString(str)); 

    ... 
} 

MatchMode.ANYWHERE.toMatchString(str) : toMatchString method converts the value string to enum from which it is called.

Options:

  • bất cứ nơi nào: '%' + giá trị + '%'
  • END: '%' + Giá trị
  • START: giá trị + '%'
  • CHÍNH XÁC: giá trị
Các vấn đề liên quan