3

私は 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 でクエリに追加して接続する方法がわかりません。

4

1 に答える 1

5

カスタムクエリを使用すると、最速で実行できると思います(select sampleに示されているように)

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

于 2013-11-25T14:51:06.403 に答える