NutzCN Logo
问答 想法:Cnd.where第三个参数能否做扩张?如可传入嵌套select
发布于 34天前 作者 l4dfire 110 次浏览 复制 上一个帖子 下一个帖子
标签:

发现nutz处理嵌套select,尤其是多级嵌套很难受.自定义sql字符串也老长.所以有这个提议.
如果不用Sqls类,是如下写法:

dao.query(A.class,Cnd.where("aid","in","SELECT DISTINCT aid FROM B WHERE bname like '%XXX%'")))

比Sqls简洁但是太多硬编码.
可否支持第三个参数传入Cnd对象提供对嵌套select的支持?
想象代码:

dao.query(A.class,Cnd.where("aid","in",Cnd.nesting(B.class,"distinct aid",Cnd.where("bname","like","%XXX%")))))

这样实现想想都兴奋,可以嵌套无数级select,还有什么复杂sql构建不出来?

说明一下,表A和表B一对多,表A是用户表,表B行为记录表类似日志用于记录表某A的行为/操作,想通过某种行为/操作查出执行者A,不使用distinct会查出很多重复行为,所以没有使用一对多来做关系查询.

这种类似通过多方的某属性来查一方的需求不少,所以上述提议是否可考虑?

14 回复

最终生成的sql是怎样的?

select * from A a where a.id in (SELECT DISTINCT aid FROM B WHERE bname like '%XXX%')

噢,试试发个pull req深入研究一下?

好的,水平不够,希望多多指点

互相学习嘛

wendal 你好你好.
像这种写法,前头我是尝试了下,发现value可以传sql语句(jdbc的pstmt这样传根本查不出东西)才有昨天的想法

` dao.query(A.class,Cnd.where("aid","in","SELECT DISTINCT aid FROM B WHERE bname like '%XXX%'")))
所以这个nesting
Cnd.nesting(B.class,"distinct aid",Cnd.where("bname","like","%XXX%"))))
其实是本质上是借用nutz的功能生成一条完整的select sql,相当于没有执行功能的dao.query()方法.
现在dao.query()是使用PojoMaker来生成一个pojo,而pojo可以导出一条完整的sql语句.
然而PojoMaker需要一个JdbcExpert成员对象来处理方言,JdbcExpert的构建又依赖于构建Dao时的dataSource.
Cnd是不知道dataSource存在的,所以这就比较尴尬啊...
现在想了想,嵌套select调用的API可能会写成这样
dao.query(A.class,Cnd.where("aid","in",dao.nesting(B.class,"distinct aid",Cnd.where("bname","like","%XXX%")))))
用dao来生成嵌套的sql条件,很奇怪...
如果把dao传给cnd就像这样
dao.query(A.class,Cnd.where("aid","in",Cnd.NEW(dao).nesting(B.class,"distinct aid",Cnd.where("bname","like","%XXX%")))))
哪种会好一点?
wen哥有空能给个的建议吗?

dao.pojoMaker()

wendal哥,你好
昨天尝试了一下
目前

dao.query(A.class, Cnd.where("aid","in",Cnd.nst(dao).select("aid",A.class,Cnd.where("aaa","in",Cnd.nst(dao).select("distinct aaa", A.class, Cnd.where("aname","=","a1"))))))

可以生成如下sql

SELECT * FROM a  WHERE aid IN (SELECT aid FROM a  WHERE aname IN (SELECT distinct aname FROM a  WHERE aname='a1'))

我天真以为直接传生成好的字符串就解决问题了,后来发现只有当op=="in"的时候才会加上双括号。
不同的操作符返回的SqlExpression不一样,我准备让nesting部分返回一个实现了Nesting接口的类,然后对不同的SqlExpression新增构造方法来处理。不过我得先准备毕业答辩还得上班,时间不充裕。希望过段时候您还记得我。

顺便问一下,贵团队以前没有考虑新增这种功能么?

恩,需要扩展一下Cnd的实现才行

wendal哥,您好,这几天我做了一些简单的修改.已经可以支持like,exists,in,等于不等于大于等嵌套sql操作.
我发个pull req您看看?

总算打开社区了.╮(╯_╰)╭.发了一会了.租房网速慢,麻烦webdal前辈指点.

我在github添加comment了哦, 暂时没空回复???

抱歉抱歉,这几天公司比较忙。。宿舍网又不好。今早才有空回复一下。

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