2012-08-15 15 views
5

Mam kwerendy SQL Hibernacja takiego:Jak wykonać kwerendę Hibernate za pomocą jak i%?

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); 

    ... 
} 

kiedy robię zapytanie jak to query.list(), mam następujący błąd:

[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". 

mogę wiedzieć, w jaki sposób mogę rozwiązać ten problem?

Odpowiedz

12

to powinno działać:

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

co, jeśli pole A ma wartość Long lub nie jest ciągiem? Następnie hibernacja nie podoba się ciągowi. Nadal chcę zrobić "rozmyte" dopasowanie (np. Zawiera użycie %%), ale kolumna jest długa. Zapytania Mysql są w porządku z tym, ale nie wydaje się, że jest hibernacja. –

3

Dla nas to działa ...

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

Przepraszam za komentarz niewielki fragment. Ale to powinno wystarczyć, aby wydostać cię z kłopotów.

EDIT: od komentarza, lower i toLowerCase() jest wdrożenie przypadek-in wrażliwości tutaj.

+0

+1 Uwaga wszystkie th e 'lower()'/'toLowerCase()' to tylko przykład, jak dopasować wielkość liter bez rozróżniania. W tym przypadku nie jest to konieczne. –

2

W tym samym przykładzie użyłem MatchMode (klasę hibernacji, aby radzić sobie z ograniczeniami bazowych podobnych).

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.

Opcje:

  • wszędzie: '%' + wartość + '%'
  • Koniec: '%' + wartość
  • START: wartość + '%'
  • EXACT: wartość
Powiązane problemy