NutzCN Logo
问答 Dao的Cnd使用Java属性名时是否支持属性是n..m关系的?
发布于 2796天前 作者 qq_deaa78a1 1887 次浏览 复制 上一个帖子 下一个帖子
标签:

Cnd很早就支持name使用Pojo的属性,但貌似这个属性名只能是直接绑定到字段上的(@Column),对于关系类的(@One @Many @ManyMany)并不支持。所以我们在做查询时,通常做法是Cnd.where("字段名","IN","select n表字段 from 中间表 where m表字段 = “+某个ID)。实际上,后面的SELECT已经可以在@ManyMany里推导出来的。是否可以支持一下,将后面的=某个ID当做op和value来处理?

4 回复

说的是这种?? 或者写出你期望的伪代码, 及生成的SQL.

Cnd.where(.....).and(Exps.one("@One/@Many映射的属性名"))

假设emp和dept是多对多
dept有emps属性是@ManyMany(target=Emp.class, relation="t_dept_emp",from="deptId",to="empId")
emp同理也有depts

查询某个dept有多少emp
传统写法是
Cnd.where("id","IN","select empId from t_dept_emp where deptId="+deptId);
是否可以改成
Cnd.where("depts","=",deptId);
也就是从emp中找到depts是多对多,然后自动加一个IN的op,并完成后面的select拼接,原来的op和value放在后面SELECT的WHERE中?
如果不直接对AbstractPItem改动,用Daos.ext这样的形式来扩展一下,也可以接受!

Cnd.where("id","IN","select empId from t_dept_emp where deptId="+deptId);

// 没法转换为下面的语句, 原因是子查询中的deptId没法推断.
Cnd.where("depts","=",deptId);

// 这样写应该靠谱一些

Cnd.where("depts","=", Cnd.where("deptId", "=", deptId));
添加回复
请先登陆
回到顶部