Flowable源码分析:SpringDataJPA实现从⾃⼰创建的数据库中
读取指定信息
在Flowable-ui-task模块查询数据库相关内容记录
⽬录:
1. 读取信息为Flowable内部对象
2. 读取信息为⾃定义对象属性
1. 读取信息为ProcessDefinition(Flowable内部对象)
ProcessDefinition为Flowable中定义的对象,因此有提供专门的数据库查询接⼝,如:
以id的⽅式
以id列表的⽅式
ProcessDefinitionQuery definitionQuery = ateProcessDefinitionQuery();
List<ProcessDefinition> definitions = definitionQuery.processDefinitionIds(processDefinitionIds).list();
⾃定义sql⽅式
NativeProcessDefinitionQuery nativeProcessDefinitionQuery = ateNativeProcessDefinitionQuery();
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实现⾃定义对象的查询。
createprocessa2. 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.sql.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
程序⼊⼝如果没有在以上⽂件的根⽬录处(如果以上⽂件为service,则根⽬录可为),则程序⼊⼝处需添加扫描注解
本项⽬中如下注解扫描如下:
@SpringBootApplication(proxyBeanMethods = false)
@ComponentScan(basePackages = {"org.flowable.ui.task.service", "org.flowable.st"}) // 扫描service、controller层
@EnableJpaRepositories(basePackages = "org.flowable.pository") // 扫描dao层(repository)
@EntityScan(basePackages = "org.flowable.del") // 扫描实体层
public class FlowableTaskApplication extends SpringBootServletInitializer {
.
.....
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论