NutzCN Logo
问答 如何使用dao构建这样的复杂的sql(多表联合查询)
发布于 3053天前 作者 SayingCode 3149 次浏览 复制 上一个帖子 下一个帖子
标签:

select *,(select count(id) from table2 where table2.id = 1) from table1 left join table3 on table3.id=table1.id
这只是一个示例
我的问题是
1.像这种需要特殊字段追加的如何写 *,(select count(id) from table2 where table2.id = 1)
2.像这种带 left join , right join 的查询语句如何写
3.像1、2这样查询出来的结果肯定是一个pojo无法包含完的,我需要domain包中单独建bean返回前端,如何将一个pojo通过dao().query 这样的函数返回的内容映射到这个自定义bean中?

目前我的解决方案:(使用不带pojo的自定义sql语句来查询)
Pager pager = dao().createPager(pageIndex, pageNum);
Sql sql = Sqls.create(“我的sql语句”);
sql.setPager(pager);
sql.setCallback(new CustomParser());
dao().execute(sql);
List list = sql.getList(Domain.class);
pager.setRecordCount(dao().count(Api_shops.class, Cnd.where("uid", "=", uid)));
....

//解析类
private class CustomParser implements SqlCallback {
@Override
public Object invoke(Connection connection, ResultSet resultSet, Sql sql) throws SQLException {
List list = new LinkedList();
Domain _item = null;
while (resultSet.next()) {
_item = new Domain();
_item.setXXX1(resultSet.getLong("表字段1"));
_item.setXXX2(resultSet.getLong("表字段2"));
.....
list.add(_item);
}
return list;
}
}

这样做也不是不可以,只是这里
1. {_item.setXXX1(resultSet.getLong("表字段1")); } 这种代码真是费时费力,眼睛一花写错个什么单词,直接玩完(屡试不爽),或者这里有个什么工具方法能直接将我的查询结构映射到domain.class中?
2.这样会不会有sql注入风险?
反正就是不爽~

4 回复

如果不是Oracle, 可以考虑用以下callback (原稿已删, 各种数据库之间的支持程度不一样,太蛋疼)

https://github.com/nutzam/nutz/blob/25655d2576d5abae47ddcf037cdf649ed95af896/src/org/nutz/dao/impl/sql/callback/FetchMultiEntitySqlCallback.java

基本思路: 获取每一列的表名,然后映射到对应的Entity上的对象

老大 你说我爱你不爱你

@sayingcode 屡试不爽,屡次试验都没有差错。爽:差错的意思。经常被误解为“没有成功”,属望文生义。该成语出自:清·蒲松龄《聊斋志异·冷生》:“言未已,驴已蹶然伏道上,屡试不爽。”
程序猿也是需要文化素养滴

添加回复
请先登陆
回到顶部