需求:有一个针对泛型的数据访问接口,基本功能是:findSingle,findByCondiction,save,delete,add
理由:隔离数据访问方式于业务层。
可以看出业务层对实现一无所知,意味着数据访问层要提供的接口可以足够满足所有数据访问操作,而其实这里关键是如何做到findByCondiction,我发现NH,只有HQL是以string形式向外暴露,也只有HQL可以通过定制一个对外输入参数为string 的findByCondiction(string hql)来解决需求问题,而这样做有点拼接SQL味道,尽管HQL不是SQL,但这种方式也存在注入问题,所以我不想用。而对于Criteria,无法做到不暴露NH情况下组织查询条件,虽然它的功能很面向对象,最后的SQL原生做法就不提了和HQL方式差不多。而看回HN3的LINQ扩展,又觉得很复杂。难道要我直接在业务层暴露NH?很郁闷,我很想用Criteria动态查询。。
1) Hql 并没有注入问题, 你可以使用参数的。如from Entity a where a.Id=:id
2) 考虑到你的接口 findByCondiction 这个方法,我觉得是建模问题,总是想用一个方法解决所有查询问题,这个是不现实的。一个大型的系统,查询非常多样,不可能就一个findByCondiction就可以解决所有问题,除非你实现了和Criteria一样整套的查询方法。 我建议是查询由子类实现,如订单,就FindByCreateTime, FindByCustomer,如果是组合查询,就新创建一个类,可以叫做OrderQuery, 有属性如CreateTime,State,Customers等,又或者用NH提供的FindExample(好像是这个名字)。
NH不太清楚,不过 ibatis 中可以通过配置xml 文件实现 动态查询
地址:http://www.mybatis.org/dotnet.html
<select id="Server_Total" resultClass="long">
select *
from A
<dynamic prepend="where">
<isNotEmpty prepend="and" property="IpAddress">
ip_address like #IpAddress#
</isNotEmpty>
<isNotEmpty prepend="and" property="Name">
name like #Name#
</isNotEmpty>
</dynamic>
</select>
类似于这样
我也在找这个问题的解决方案,没有啊?