三张表上的 Ormlite 内连接

Posted

技术标签:

【中文标题】三张表上的 Ormlite 内连接【英文标题】:Ormlite inner join on three tables 【发布时间】:2011-11-10 05:07:20 【问题描述】:

我想在三个表上创建一个内部连接,例如:

SELECT C.Description, D.ItemDescription
  FROM OrderDetailStatement AS D 
 INNER JOIN OrderHeaderStatement AS H 
    ON H.OrderHeaderStatementRefID = D.OrderHeaderStatementRefID 
 INNER JOIN customers AS C 
    ON H.CustomerRefID = C.CustomerRefID
 WHERE (D.MixedValue > 1000)

但我有点困惑,你能提供一个演练吗?

提前致谢

【问题讨论】:

请发布您遇到的错误? 我只是尝试使用纯sql,因为我仍然不明白-如何使用ormlite ormlite编写查询。我只需要一个例子。任何涉及 3 个表的示例。 请注意,我们在 4.42 @Antonis 中添加了基本的 JOIN 支持。我已经更新了我的答案。 【参考方案1】:

ORMLite 现在支持simple JOIN statements。您可以执行以下操作:

// start the order header query
QueryBuilder<OrderHeader, Integer> orderHeaderQb = orderHeaderDao.queryBuilder();
QueryBuilder<Customer, Integer> customerQb = customerDao.queryBuilder();
// join with the order query
orderHeaderQb.join(customerQb);
// start the order statement query
QueryBuilder<OrderStatement, Integer> orderStatementQb =
    orderStatementDao.queryBuilder();
orderStatementQb.where().gt("mixedvalue", 100);
// join with the order-header query
orderStatementQb.join(orderHeaderQb);
List<OrderStatement> orderStatementQb.query();

但是请注意,您只能使用此机制从查询构建器中获取实体。如果您想从不同的对象中获取两个描述字段,那么您仍然必须使用原始查询。

支持“原始查询”,包括您可以使用自己的 SQL 的 Dao.queryRaw() 方法。我怀疑你已经找到它们了。这是docs for raw queries。

【讨论】:

ormlite.com/javadoc/ormlite-core/doc-files/… 来自@haddr:到目前为止,如果您想要其他表中的完全水合实体,您可以在外键上的@DatabaseField 注释上使用foreignAutoRefresh。这样,在查询时,所有外国实体都将检索其字段。 @Gray 我们如何做一个原始查询返回来自不同对象的字段?我试图在某个地方找到答案,但找不到...

以上是关于三张表上的 Ormlite 内连接的主要内容,如果未能解决你的问题,请参考以下文章

同一张表上的多个连接:转换状态

同一张表上的多个连接,在一个查询中计数

Mysql在同一张表上的多个左连接

MYSQL 三张表查询

MySQL—— 连接查询

mysql三表联合查询