orm框架中动态查询的思考
一个常见的功能,根据用户名或者性别查找用户
做法有以下几种:
1、自己根据用户名和性别是否为空手动组装jpql。
2、在dao层使用动态查询criteria
3、在controller层或service层使用动态查询criteria
如果使用第一种方式,效率很低,也容易出错。
如果使用第二种方式,service层和dao层都会加入大量的接口,因为每个查询的条件都不一样,所以会产生大量的查询接口
如果使用第三种方式,要在controller或者service中引入dao中的criteria。根据面向接口编程和分层的思想,dao框架的接口和类是不应该出现在service和controller中的。考虑到这种情况,可以自己实现一套criteria,最后在dao层将自己实现的criteria转换成jpa的criteria或者jpql,这样就可以实现解耦。不足是这种做法增加了很多工作量
我们都知道criteria是通过会话管理获得的,service如何能获得criteria呢? 这里可以使用回调(闭包),定义一个接口,该接口包含一个方法,方法参数包含criteria;然后把这个接口当作service方法的参数,最后由dao调用该接口的方法。可参考spring-data-JPA中Repository的实现。
个人感觉这三种方法都不太理想,不知道大家是怎么做的,有没有其他的方案