专栏首页生活不止眼前的代码SpringDataJPA笔记(10)-动态设置表名

SpringDataJPA笔记(10)-动态设置表名

SpringDataJPA笔记(10)-动态设置表名

在实际使用中可能会遇到需要动态设置表名的情况,特别是通常在后台管理系统里面,总有一些相似的功能需要抽象出来写一些公共的方法,以减少代码开发量,降低重复劳动

首先看BaseRepository的代码

@NoRepositoryBean
public interface BaseRepository<T, ID extends Serializable> extends JpaRepository<T, ID>, JpaSpecificationExecutor<T>, Serializable {

    @Transactional
    @Modifying(clearAutomatically = true)
    @Query("update #{#entityName} t set t.age=?2 where t.id = ?1")
    int updateAge(ID id, int age);

    @Query("select t.id from #{#entityName} t ")
    List<ID> findIds();
}

然后创建一个BaseController

@Slf4j
public class BaseController<R extends BaseRepository<T, ID>, T extends AnimalEntity, ID extends Serializable> {
    @Autowired
    private R repository;

    @ApiOperation(value = "baseAll", httpMethod = "GET")
    @GetMapping(value = "/base/all")
    public List<T> baseAll() {
        log.info("BaseController list");
        return repository.findAll();
    }

    @ApiOperation(value = "update age by id", httpMethod = "GET")
    @GetMapping(value = "/update/age/{id}")
    public T baseAll(@PathVariable ID id, @RequestParam int age) {
        log.info("BaseController list");
        repository.updateAge(id, age);
        Optional<T> optional = repository.findById(id);
        if(optional.isPresent()){
            return optional.get();
        }
        return null;
    }


    @ApiOperation(value = "base ids", httpMethod = "GET")
    @GetMapping(value = "/base/ids")
    public List<ID> findIds() {
        log.info("BaseController list");
        return repository.findIds();
    }


}

在分别创建两个不同的controller

ChapterTenCatController

@RestController
@RequestMapping("/chapter/ten/cat")
public class ChapterTenCatController extends BaseController<CatRepository, CatEntity, Long> {
}

ChapterTenDogController

@RestController
@RequestMapping("/chapter/ten/dog")
public class ChapterTenDogController extends BaseController<DogRepository, DogEntity, Long> {
}

运行代码之后,查看swagger-ui的页面

可以看到多了两个controller

打开这两个controller,看到里面的接口是在BaseController里面写的

分别运行里面的接口,可以看到是分别查询和更新了cat表和dog表的数据

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • SpringDataJPA笔记(15)--Inheritance注解详解之JOINED

    SpringDataJPA笔记(15)–Inheritance注解详解之JOINED

    yingzi_code
  • JAVA-线程安全与锁机制详解

    JAVA中操作共享数据按照线程安全程度大致分为5类: 不可变,绝对线程安全,相对线程安全,线程兼容和线程对立

    yingzi_code
  • JAVA线程池的几种使用方式以及线程同步详解

    volatile还有一个重要的作用是禁止指令重排序优化,举个例子 下面代码中如果initFlag不用volatile修饰的话,就不能保证程序在运行的时候num...

    yingzi_code
  • 浅谈CAS在分布式ID生成方案上的应用 | 架构师之路

    近几篇文章聊CAS被骂得较多,今天还是聊CAS,谈谈CAS在一种“分布式ID生成方案”上的应用。 所谓“分布式ID生成方案”,是指在分布式环境下,生成全局唯一I...

    架构师之路
  • 使用ES-Hadoop插件结合spark向es插入数据

    我是攻城师
  • <一>深入理解Threadlocal的实现原理

    文章开头我想说,这是一篇面向不怎么懂  Threadlocal 的朋友的博客,所以有的人会觉得有点啰嗦,但不论您水平高低,相信耐着性子看完也一定会有收获。

    用户2141593
  • 深入理解Threadlocal的实现原理

    文章开头我想说,这是一篇面向不怎么懂  Threadlocal 的朋友的博客,所以有的人会觉得有点啰嗦,但不论您水平高低,相信耐着性子看完也一定会有收获。

    矿泉水
  • 论文必备:如何用卡片法写论文?

    王老师,你所描述的卡片式写作,看来写篇博客或者写部小说,应该还可以。用来写学术论文不合适吧?

    Datawhale
  • ZooKeeper 技术内幕|Leader 选举是一个什么样的过程?

    Leader 选举过程,本质就是广播优先级消息的过程,选出数据最新的服务节点,选出优先级最高的服务节点,基本步骤:

    用户1278550
  • 当async/await遇上forEach

    这是在做格式化wang.oa.com的时候遇到的一个问题,在邮件中提出后,收到了avenwu和erasermeng两位前辈的回复和指导,特此感谢。本文在他们指导...

    IMWeb前端团队

扫码关注云+社区

领取腾讯云代金券