Если вы используете Criteria для создания запроса, вы можете создать свое собственное выражение, которое подклассов org.hibernate.criterion.LikeExpression, используя один из защищенных конструкторов, который принимает в качестве символа escapeChar и выполняет подстановку в значении для тебя. При условии, что '!' это известное значение, которое не будет ни в одной строке поиска (я думаю, вы можете выбрать любое, которое вам нравится), вы можете просто сделать:
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;
}
}
если нет таких символов (которые не будут отображаться в вашем поисковом значении в виде литералов), то добавьте следующую строку в качестве первой строки escapeString (), чтобы экранировать их тоже:
inputString = inputString.replace("!", "!!");