java - example - Configure Hibernate para escapar de guiones bajos en cláusula LIKE usando el dialecto de SQL Server
jdbc sql server connection string (2)
¿Por qué no puedes hacer un reemplazo de cadena en el valor? ¿Cómo se usa esto para que esta sea una solución no viable?
Tengo una consulta SQL SELECT que tiene una cláusula LIKE que contiene un guión bajo, que debe buscar específicamente un guión bajo, no tratarlo como un comodín:
SELECT * FROM my_table WHERE name LIKE ''_H9%'';
Entiendo que puedo cambiar la cláusula actual a ''[_] H9%'' para que funcione como esperaba, pero el problema es que esta cláusula está siendo generada por Hibernate.
¿Hay alguna manera de configurar Hibernate para escapar de todos los guiones bajos en todas las consultas de esta manera? En su defecto, ¿hay alguna manera de configurar SQL Server (2008 en mi caso) para no tratar los caracteres de subrayado como comodines?
Si está utilizando Criteria para crear la consulta, puede crear su propia expresión que subclasifica org.hibernate.criterion.LikeExpression, utilizando uno de los constructores protegidos que toma ''Character escapeChar'', y realiza la sustitución en el valor por usted. Asumiendo que ''!'' es un valor conocido que no estará en ninguna cadena de búsqueda (puede elegir el que más le guste, supongo), puede hacer:
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;
}
}
si NO HAY tales caracteres (que no aparecerán en su valor de búsqueda como literales), agregue lo siguiente como la primera línea de escapeString () para escapar de esos también:
inputString = inputString.replace("!", "!!");