Ebean: объединить несколько выражений с помощью OR
Я использую PLAY Framework 2.2.1 и хочу создать запрос для поиска в базе данных терминов, которые я получаю из формы ввода.
Это то, что я получил до сих пор, но это не работает:
...
List<String> terms;
public static Model.Finder<Integer, XYZ> find = new Model.Finder<Integer, XYZ.class>(Integer.class, XYZ.class);
ExpressionList<XYZ> el = XYZ.find.where();
for(String term : terms){
el.add(Expr.ilike("name", term + "%"));
}
List<XYZ> results = XYZ.find.where().add(el.disjunction()).findList();
Я не знаю, как добавить и подключить несколько выражений с помощью OR к моему запросу.
1 ответ
Решение
Я думаю, что вы сделаете это быстрее всего с пользовательским запросом (как показано в избранном примере)
com.avaje.ebean.Query<Xyz> query = com.avaje.ebean.Ebean.createQuery(Xyz.class);
query.where("lower(first_name) like :first_name OR lower(last_name) like :last_name ")
.setParameter("first_name", "John".toLowerCase()+"%")
.setParameter("last_name", "Doe".toLowerCase() + "%");
List<Xyz> xyzList = query.findList();
Вы также можете сделать более сложную комбинацию с пронумерованными параметрами, а именно:
List<String> sqlList = new ArrayList<>();
List<Object> paramsList = new ArrayList<>();
sqlList.add("lower(first_name) like ?");
paramsList.add("John".toLowerCase() + "%");
sqlList.add("lower(last_name) like ?");
paramsList.add("John".toLowerCase() + "%");
if (optionallyCheckTheNick) {
sqlList.add("lower(nick) like ?");
paramsList.add("johnie".toLowerCase() + "%");
}
Query<Xyz> query = Ebean.createQuery(Xyz.class);
query.where(StringUtils.join(sqlList, " OR "));
int i = 1; // first param uses index 1 NOT 0!
for (Object param : paramsList) {
query.setParameter(i, param);
i++;
}
List<Xyz> xyzList = query.findList()
Просто убедитесь, что вы всегда добавляете в sqlList
а также paramsList
в парах!