2008-11-17 7 views
5

ich eine SQL-SELECT-Abfrage haben, die eine LIKE-Klausel enthält einen Unterstrich hat, die speziell für einen Unterstrich aussehen sollte, behandeln sie nicht als Platzhalter:Konfigurieren Hibernate Unterstrichen in LIKE-Klausel mit SQL Server Dialekt zu entkommen

SELECT * FROM my_table WHERE name LIKE '_H9%'; 

Ich verstehe, dass ich die tatsächliche Klausel in '[_] H9%' ändern kann, damit dies wie erwartet funktioniert, aber das Problem ist, dass diese Klausel von Hibernate generiert wird.

Gibt es eine Möglichkeit, Hibernate so zu konfigurieren, dass auf diese Weise alle Unterstriche in allen Abfragen unterdrückt werden? Fehlt das, gibt es eine Möglichkeit, SQL Server (2008 in meinem Fall) zu nicht zu konfigurieren, Unterstreichungen als Platzhalter zu behandeln?

+0

Welche API spielst Du mit Hibernate (dh Criteria Query HQL, etc.) Ihre Suche: Wert als Literale) fügen Sie dann den folgenden als die erste Zeile von Escape() diejenigen zu entfliehen? Es wird hilfreich sein, wenn Sie einen Teil der Code/Ruhezustand-Konfiguration bereitstellen. – FoxyBOA

Antwort

5

Wenn Sie Criteria verwenden, um die Abfrage zu erstellen, können Sie einen eigenen Ausdruck erstellen, der org.hibernate.criterion.LikeExpression mit einem der geschützten Konstruktoren, die 'Character escapeChar' übernehmen, subclassiert Wert für dich. Vorausgesetzt, dass '!' ist ein bekannter Wert, der nicht in allen Suchzeichenketten sein (alle mögen Sie Sie wählen können, ich denke), können Sie einfach tun:

public class EscapingLikeExpression extends LikeExpression { 
    public EscapingLikeExpression(String propertyName, String value) { 
     super(propertyName, escapeString(value), '!', false); 
    } 

    static String escapeString(String inputString) { 
    inputString = inputString.replace("_", "!_"); 
    return inputString; 
    } 

} 

wenn es keine solche Zeichen (das in nicht angezeigt

inputString = inputString.replace("!", "!!"); 
0

Warum können Sie keine Zeichenfolge ersetzen auf den Wert? Wie wird das verwendet, so dass dies eine nicht praktikable Lösung ist?