带子查询的ebean查询

时间:2013-06-16 15:45:02

标签: sql ebean

我正在尝试使用相当于

的EBean
select * from myTable1 where id not in (select id2 from myTable2) ;

我没有table2对象中的table1对象的引用,反之亦然。 有谁知道如何使用EBean?

目前我只有:

List<MyTable1> myResult = MyTable1.find.where().eq("id","1" ).findList();

感谢。

C.C。

2 个答案:

答案 0 :(得分:2)

显然,自2009年以来,使用此错误报告中给出的示例可以做到这一点:

http://www.avaje.org/bugdetail-92.html

示例:

Query<Product> subQuery =   
    Ebean.createQuery(Product.class)  
        .select("sku")  
        .where().idEq(4).query();  

List<MinCustomer> list = Ebean.find(MinCustomer.class)  
    .where().in("name", subQuery)  
    .findList(); 

<强>然而

我无法使其正常工作,因为生成的SQL无效。看似由于在Ebean中的场景后面发生了字符串替换,(至少对我而言)子查询中的表名丢失了。

我希望它与我的主查询有关,包括对我的子查询“正在选择”的表的引用。

从示例中转出有效的SQL:

select c.id, c.name, c.notes   
from o_customer c   
where  (c.name) in (select p.sku  from o_product p  where p.id = ?  )  

...在我的情况下进入这个无效的SQL:

select t0.id as c0, ... t0.location_id as c8
from myRecordClass t0
where  (t0.location_id) in (
    select t0.id
    from t0.location_id t0    # should be: from location t0
    where t0.customer_id = ?
    )  and t0.creation > ?  
order by t0.creation desc

解决方法:

使用像https://stackoverflow.com/a/27431625/190599中的RawSql方法 - 例如:

String sql = "select b.id, b.location_id ... " +
        "from myRecordClass b " +
        "where location_id in (" +
            "select id " +
            "from location " +
            "where customer_id = " + user.getCustomer().getId() +
        ") " +
        "order by creation desc limit 10";

RawSql rawSql = RawSqlBuilder
        .parse(sql)
        .columnMapping("b.id", "id")
        .columnMapping("b.location_id", "location.id")
        ....
        .create();

Query<MyRecordClass> query = Ebean.find(MyRecordClass.class);
query.setRawSql(rawSql);
final List<MyRecordClass> list = query.findList();

答案 1 :(得分:0)

我几乎不相信RawSql是实现此类查询的最快方法,它允许您返回映射对象的列表。

也可以使用SqlQuery(在Reference guide (PDF)中描述)来获取SqlRow的列表 - 这样您就可以找到所需的数据,而不需要任何映射。