创建可能包含或可能不包含参数的 JPA 查询的最佳方法
Best way to create JPA query that might contain a parameter or might not
有一种方法可以像这样创建 JPA 查询
String queryString = "SELECT i FROM Item i";
if (null != search) {
queryString += " WHERE i.name LIKE :pattern";
}
TypedQuery<Item> query = entityManager.createQuery(queryString, Item.class);
if (null != search) {
query.setParameter("pattern", "%" + search + "%");
}
并且有 2 个检查是否查询需要有可选的搜索字段 (if null != search)
避免重复的最常见方法是什么?
对于单个参数,可能有 2 个命名查询,或者 Criteria API 可能允许避免这种情况(因为没有查询字符串),但是还有其他方法吗?
如果您不必以编写查询字符串的方式编写查询,则可以使用 JPA 条件 API。您可以看到我称之为 "ExampleDao" 的 class,我将其用于研究和示例 here。
然后您可以向其中添加一个可选的 where 子句,请参见下面的示例:
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Item> criteria = cb.createQuery(Item.class);
Root<Item> root = criteria.from(Item.class);
criteria.select(root);
if (null != search) {
String pattern = "%pattern here%";
criteria.where(cb.like(root.get("name"), pattern));
}
有一种方法可以像这样创建 JPA 查询
String queryString = "SELECT i FROM Item i";
if (null != search) {
queryString += " WHERE i.name LIKE :pattern";
}
TypedQuery<Item> query = entityManager.createQuery(queryString, Item.class);
if (null != search) {
query.setParameter("pattern", "%" + search + "%");
}
并且有 2 个检查是否查询需要有可选的搜索字段 (if null != search)
避免重复的最常见方法是什么?
对于单个参数,可能有 2 个命名查询,或者 Criteria API 可能允许避免这种情况(因为没有查询字符串),但是还有其他方法吗?
如果您不必以编写查询字符串的方式编写查询,则可以使用 JPA 条件 API。您可以看到我称之为 "ExampleDao" 的 class,我将其用于研究和示例 here。
然后您可以向其中添加一个可选的 where 子句,请参见下面的示例:
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Item> criteria = cb.createQuery(Item.class);
Root<Item> root = criteria.from(Item.class);
criteria.select(root);
if (null != search) {
String pattern = "%pattern here%";
criteria.where(cb.like(root.get("name"), pattern));
}