2012-08-15 5 views
5

Ich habe eine Hibernate SQL-Abfrage wie folgt aus:Wie mache ich die Hibernate-Abfrage mit like und%?

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

    ... 
} 

, wenn ich eine Abfrage wie diese query.list() machen, habe ich Fehler folgende:

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

Darf ich wissen, wie ich dieses Problem lösen könnte?

Antwort

12

dies sollte funktionieren:

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

Was ist, wenn fieldA ein Long oder Non-String ist? Dann mag Hibernate die Zeichenfolge nicht. Ich möchte immer noch eine "unscharfe" Übereinstimmung (dh. Enthält %%), aber die Spalte ist ein Long. Mysql-Abfragen sind in Ordnung, aber es scheint nicht, dass Ruhezustand ist. –

3

Für uns funktioniert ...

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

leider noch kleinen Ausschnitt für die Buchung. Aber das sollte genug sein, um Sie aus den Schwierigkeiten zu befreien.

EDIT: von Kommentar, lower und toLowerCase() ist hier fall in Empfindsamkeit zu implementieren.

+0

+1 Beachten Sie alle th e 'lower()'/'toLowerCase()' ist nur ein Beispiel dafür, wie Groß- und Kleinschreibung nicht berücksichtigt wird. Es ist in diesem Fall nicht notwendig. –

2

Im gleichen Beispiel, ich habe MatchMode (Klasse von Hibernate, mit wie Prädikat Einschränkungen umgehen) verwendet.

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.

Optionen:

  • ÜBERALL: '%' + Wert + '%'
  • END: '%' + Wert
  • START: Wert + '%'
  • EXACT: Wert
Verwandte Themen