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

摘要:
definitions=definitionQuery.processDefinitionIds(processDefinitionIds).list();过程定义>a) .list();弹簧引导起动器数据jpa<lombok<org.springframework.boot<

在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

免责声明:文章转载自《Flowable源码分析:Spring Data JPA实现从自己创建的数据库中读取指定信息》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Neo4j 第五篇:批量更新数据服务器架设:CentOS搭建LNMP详细教程(转)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

如何通过外部表做数据一致性检查和配平

背景 随着微服务和分布式架构的兴起及用户对数据高可用的重视。现在系统中的数据会通过程序定时同步、抽数工具、复制工具等在多个数据库中存在多份。但因为程序异常、网络异常、数据异常等各种原因,会出现数据不一致的情况。如何能简单快速检测出数据不一致并且配平呢?本文通过PostgreSQL的fdw机制,介绍一种简单的配平方法。 环境准备 源数据库 IP:xx....

【web/app】charles抓包https/模拟弱网/设置断点/修改接口请求值或返回值/压测

charles几个常用功能 charles本质一是一个代理服务器,可以抓移动端也可以抓web端,都需要安装证书   1,抓包https网页:(如未配置,会显示unknown) 第一步:安装证书 if 移动端,首先:给手机安装SSL证书 手机和电脑在同一wifi下,手机wifi配置http代理,ip是电脑ip,端口一般默认8888 安装SSL证书到手机,...

14.4 Set集合

1、概述Set集合中的对象不按特定的方式排序,只是简单地把对象加入集合,但Set集合中不能包含重复对象。Set集合由Set接口和Set接口的实现类组成。Set接口继承了Collection接口,因此包含Collection接口的所有方法。2、Set解耦常用的实现类有HashSet类与TreeSet类   a、HashSet类实现Set接口,由哈希表(实际上...

Javascript加载执行问题探索

楼主做前端开发一年多了,对前端的见解还是多多少少有一点的,今天特拿出来跟大家分享分享。 做前端开发少不了各种利器。比如我习惯用的还是Google浏览器和重型武器Fiddller。 一: 原始情况 首先大家看看如下的代码: 1 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Defa...

C#中web项目使用log4net日志

  我准备把log4net的实现方法放在一个类库项目中,别的项目直接引用该类库,即可进行日志的记录,操作步骤如下: 1.下载log4net.dll文件 2.在解决方案下创建类库项目 3.把log4net.dll添加到上面创建的类库引用中 4.在web项目下,创建单独的log4net配置文件(当然,也可以写在web.config里),配置文件的内容如下 &...

HTML Img标签 src为网络地址无法显示图片问题解决(https)

举例说明: <img src="https://pic.cnblogs.com/avatar/1549846/20191126100502.png" alt="加载失败"> 图片无法显示 只需要在<head>标签内添加 <meta name="referrer" content="no-referrer">就可以了 1...