• Flowable源码分析:Spring Data JPA实现从自己创建的数据库中读取指定信息


    在Flowable-ui-task模块查询数据库相关内容记录

    目录:

    1. 读取信息为Flowable内部对象
    2. 读取信息为自定义对象属性
    1. 读取信息为ProcessDefinition(Flowable内部对象)

    ProcessDefinition为Flowable中定义的对象,因此有提供专门的数据库查询接口,如:

    • 以id的方式
    repositoryService.getProcessDefinition(processDefinitionId)
    
    • 以id列表的方式
    ProcessDefinitionQuery definitionQuery = repositoryService.createProcessDefinitionQuery();
    List<ProcessDefinition> definitions = definitionQuery.processDefinitionIds(processDefinitionIds).list();
    
    • 自定义sql方式
    NativeProcessDefinitionQuery nativeProcessDefinitionQuery = repositoryService.createNativeProcessDefinitionQuery();
    List<ProcessDefinition> definitions = nativeProcessDefinitionQuery.sql("SELECT act_re_procdef.* " +
        "FROM act_re_procdef,act_proc " +
        "WHERE act_a.A_ID_ = #{aId} AND act_re_procdef.ID_ = act_a.PROC_DEF_ID_ " +
        "ORDER BY a" +
        "DESC")
        .parameter("a", a).list();
    

    项目中暂时只了解、用到以上几种查询接口,这些查询仅限Flowable内部定义的对象,对自定义对象查询没有提供相应接口。
    本文在以下部分记录实验室小伙伴介绍的使用JPA实现自定义对象的查询。

    1. Spring Data JPA实现Flowable自定义对象查询
    • 添加依赖
      本项目将依赖添加在了logic模块下的pom文件中
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    
    • 相关配置
      在app模块的flowable-default.properties中添加以下maven配置
    # DATABASE
    spring.datasource.driver-class-name=com.mysql.jdbc.Driver
    spring.datasource.url=jdbc:mysql://127.0.0.1:3306/flowable?characterEncoding=UTF-8
    spring.datasource.username=root
    spring.datasource.password=root
    
    # JPA
    spring.jpa.database=MYSQL
    spring.jpa.show-sql=true
    spring.jpa.hibernate.ddl-auto=update
    spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.ImprovedNamingStrategy
    spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
    
    • 创建实体
    @Entity
    @Table(name = "act_a")
    public class MyObject{
    
        @Id
        @GeneratedValue(strategy = IDENTITY)
        @Column(name = "ID_", unique = true, nullable = false)
        private Integer id;
    
        @Column(name = "NAME_", unique = true)
        private String name;
    
        @Column(name = "ADDRESS_", unique = true)
        private String address;
    
    
        public MyObject(String name, String address) {
            this.name= name;
            this.address= address;
        }
    
        public MyObject() {
    
        }
    
        // getters and setters
    }
    

    实体类名与数据库表名不一样时可在Table的name属性中指定数据库表名
    同样,属性名与数据库中字段名不一样时,可在column的name属性中指定对应数据库表中的字段名

    • dao层:Repository构建
      该接口JPA会自动注入实现,不需要自己另外编写代码
    public interface MyObjectRepository extends JpaRepository<MyObject, Integer> {
        @Query(value = "select ID_, NAME_, ADDRESS_ from act_a where ACT_AId_= ?1", nativeQuery = true)
        List<MyObject> findByAId(String aId);
    }
    

    查询时select后面的字段需要写上实体类定义的所有属性对应的字段(此处为id、name、address对应的字段),否则会报错“某列找不到”

    另外,以下引用接口方法名实现数据库操作的语法

    Spring Data JPA 可以根据接口方法名来实现数据库操作,主要的语法是 findXXBy、readAXXBy、queryXXBy、countXXBy、getXXBy 后面跟属性名称,利用这个功能仅需要在定义的 Repository 中添加对应的方法名即可,使用时 Spring Boot 会自动帮我们实现.

    • service部分
    @Resource
    private MyObjectRepository myObjectRepository;
    
    public ResultListDataRepresentation getMyObjects(String aId){
    
       List<MyObject> myObjects = myObjectRepository.findByAId(aId);
       ResultListDataRepresentation result = new ResultListDataRepresentation(myObjects );
       return result;
       }
    
    • APPLYCATION
      程序入口如果没有在以上文件的根目录处(如果以上文件为org.flowable.root.service,则根目录可为org.flowalbe.root),则程序入口处需添加扫描注解
      本项目中如下注解扫描如下:
    @SpringBootApplication(proxyBeanMethods = false)
    @ComponentScan(basePackages = {"org.flowable.ui.task.service", "org.flowable.ui.task.rest"})  // 扫描service、controller层
    @EnableJpaRepositories(basePackages = "org.flowable.ui.task.repository") // 扫描dao层(repository)
    @EntityScan(basePackages = "org.flowable.ui.task.model")  // 扫描实体层
    public class FlowableTaskApplication extends SpringBootServletInitializer {
         ......
    }
    

    参考链接:
    Spring Data JPA: https://www.cnblogs.com/wadmwz/p/10313495.html
    实体类常用注解: https://blog.csdn.net/Mr_DouDo/article/details/79380642
    SpringBoot JPA 中无法注入 JpaRepository 接口的问题: https://blog.csdn.net/weixin_30549175/article/details/99445024
    cannot resolve column或cannot resolve table(据说这个问题可以不用解决?不影响?):
    https://blog.csdn.net/qq78442761/article/details/104287164
    https://blog.csdn.net/weixin_42941486/article/details/100660560

    步履不停
  • 相关阅读:
    javascript、CSS、XML动太生成树菜单
    设表格细钱
    JS操作JSON总结
    Meta标签详解
    js中eval详解
    搜虎网上线
    Fluent NHibernate demo 示例
    Oracle 索引概述
    程序员如何加薪——请看《谁赚走了你的薪水_让经济学帮你加薪].(英)蒂姆·哈福德.扫描版[ED2000.COM].pdf》
    expertoracledatabasearchitectureoracledatabaseprogramming9i10gand11gtechniquesandsoluti.pdf
  • 原文地址:https://www.cnblogs.com/yuanyunjing/p/13745456.html
Copyright © 2020-2023  润新知