二次封装 Spring Data JPA/MongoDB,打造更易用的数据访问层( 三 )

  • 接着判断是否存在 Field 注解,它是用来标识数据库字段和类变量不一样的情况,如果出现这种情况,我们使用注解所标识的字段名 。
  • 最后,以上两种情况排除后,我们直接使用这个字段的名字 。
  • 这样就可以达到如下效果了:
    fun test() {?userRepository.listAll(Criteria.where(CssUser::account.mongoFiled()).`is`("admin").and(CssUser::name.mongoFiled()).`is`("你的名字"))?}复制代码接着我们可以来说说 Java 的做法,首先也需要一个方法通过 lambda 拿到字段名,这个方法网上有很多我不再赘述,但是拿到之后该怎么办呢?
    你当然可以直接通过工具类的静态方法去拿,就像这样:
    fun test() {?userRepository.listAll(Criteria.where(Util.getName(CssUser::account).`is`("admin").and(Util.getName(CssUser::name).`is`("你的名字"))?}复制代码可能到这一步看起来还是略微不雅,追求极致的小伙伴这个时候就可以再度发挥封装的本色,将 Criteria 类封装出一个新的查询条件类,比如叫 Condition,然后将 Criteria 装在里面再封装一下查询时的相关常用方法,就像这样(注意此处的 Funtion 入参只是一个例子,实际应该是泛型):
    public class Condition {private Criteria criteria = new Criteria();?public Condition where(Function<String, String> function, String value) {criteria.andOperator(Criteria.where(Util.getName(function)).is(value));return this;}}复制代码除了 where 方法你还可以继续封装 gt、lt、or 等常用方法,并且它们还能形成链式调用,最终的效果是这样的:
    public static void main(String[] args) {Criteria criteria = new Condition().where(CssUser::getName, "你的名字").where(CssUser::getAccount, "admin");}复制代码是不是更优雅了呢?
    4. 最后今天是满满的技术干货,希望 Get 到新技能的小伙伴可以积极的点赞,有什么问题都可以再评论区留言,我会积极对线的,下篇见 。
    【二次封装 Spring Data JPA/MongoDB,打造更易用的数据访问层】作者:和耳朵
    链接:
    https://juejin.cn/post/7168133740093243423




    推荐阅读