2013-11-25 49 views
2

我使用PLAY Framework 2.2.1,我想建立一個查詢來搜索數據庫中我從輸入表單中獲得的術語。Ebean:加入多個表達式或OR

這是我這麼遠,但它不工作:

... 
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(); 

我不知道如何與或我的查詢添加和連接多個表達式。

回答

4

我想你會做到這一點用最快的自定義查詢(如顯示,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(); 

您也可以用編號PARAMS更先進的組合,即:

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() 

剛確保你總是添加成對的sqlListparamsList

+0

如果我不想兩次「喜歡」但是「喜歡」,該怎麼辦。我如何製作一個循環?這個問題沒有辦法嗎?如果我理解正確,可以對給定的表達式列表(=> ExpressionList)使用方法dijunction()。但我不知道如何創建一個新的實例以及如何應用它。 –

+1

檢查我對「n」大小查詢的編輯 – biesior

+0

您的代碼對我來說工作正常,但如果我有一個屬性有多個參數,則沒有結果。 我想要的是這樣的查詢: select t0.id c0,t0.name c1 from view_xyz t0其中t0.name像「ab%」或t0.name像「b%或t0.name like」c% 「 但是System.out.println(query.getGeneratedSql())返回這個: select t0.id c0,t0.name c1 from view_xyz t0 where t0.name like? –