Попробуйте посмотреть Критерий запроса
Criteria crit = sess.createCriteria(Product.class);
if (productNameCriteria.equalsIgnoreCase("IS"))
crit.add( Restrictions.eq("productName", productName);
else if (productNameCriteria.equalsIgnoreCase("BEGINS WITH"))
crit.add( Restrictions.like("productName", productName + "%")
// etc
Если вам абсолютно необходимо создать строковый запрос, вы должны использовать StringBuilder
StringBuilder sb = new StringBuilder();
sb.append("select count(*) from Product p where ");
if (productNameCriteria.equalsIgnoreCase("IS"))
sb.append("p.productName = '").append(productName).append("'");
// etc
String query = sb.toString();
Использование StringBuilder
уменьшает количество экземпляров, создаваемых во время выполнения.
Вы также можете изучить использование параметров запроса, которые могут снизить сложность запроса, хотя я не знаю, каковы эффекты производительности запроса во время выполнения.
"select count(*) from Product p where p.productName = :productName"
"select count(*) from Product p where p.productName = ?"
Затем вы можете использовать Query#setParameter
(или один из других вариантов, например setString
), чтобы определить значения в запросе. Это также намного лучший способ построения запроса, потому что он будет автоматически управлять цитированием и экранированием значений, которые вы получаете от пользовательского интерфейса. Использовать параметры запроса, а не конкатенацию строк , независимо от того, как вы строите строку запроса.