2014-07-07 16 views
0

我試圖通過給出一些查詢字符串的全名找到用戶。在我的表格中,我有「First_Name」和「Last_Name」列,但沒有「Full_Name」列。如何連接Ebean中的兩列Like條目

使用Avaje Ebean,我想用連接「First_Name」和「Last_Name」的like子句進行查詢,然後將其與n%(查詢中的名稱)進行比較。在SQL中,查詢會喜歡:

SELECT * FROM users 
WHERE 
concat(users.First_Name , ' ' , users.Last_Name) LIKE 'n%' 
OR users.First_Name LIKE 'n%' OR users.First_Name LIKE '%n' 
OR users.Last_Name LIKE 'n%' OR users.Last_Name LIKE '%n' 

這可能與Ebean有關嗎?

回答

1

是的,它通過RawSql

我允許你使用自己的SQL語句給定的查詢是可能的。從文檔

樣品

// Use raw SQL with an aggregate function 

String sql 
    = " select order_id, o.status, c.id, c.name, sum(d.order_qty*d.unit_price) as totalAmount" 
    + " from o_order o" 
    + " join o_customer c on c.id = o.kcustomer_id " 
    + " join o_order_detail d on d.order_id = o.id " 
    + " group by order_id, o.status "; 

RawSql rawSql = 
    RawSqlBuilder 
     // let ebean parse the SQL so that it can 
     // add expressions to the WHERE and HAVING 
     // clauses 
     .parse(sql) 
     // map resultSet columns to bean properties 
     .columnMapping("order_id", "order.id") 
     .columnMapping("o.status", "order.status") 
     .columnMapping("c.id",  "order.customer.id") 
     .columnMapping("c.name", "order.customer.name") 
     .create(); 


Query<OrderAggregate> query = Ebean.find(OrderAggregate.class); 
    query.setRawSql(rawSql)   
    // add expressions to the WHERE and HAVING clauses 
    .where().gt("order.id", 0) 
    .having().gt("totalAmount", 20); 

List<OrderAggregate> list = query.findList(); 

編輯:我只是檢查養活我的好奇心,也可以(至少在遊戲框架):

Ebean.find(MyModel.class).where().like("concat(subject, ' ' , body)", "%foo%").findList(); 
+0

雖然我知道這種可能性,我很想堅持Ebean的內置方法。我試着遠離'RawSql',除非沒有別的辦法 – nmagerko

+0

@nmagerko,檢查我的編輯,底部 – biesior

+0

哇,我沒有意識到你可以用這種方式注入自己的原始SQL;我認爲它必須用'RawSql'對象完成。 Nice find – nmagerko