querydsl使用说明( jira插件里,查询数据的时候,可以使用jira内置的querydsl或者官方封装的工具包atlassian-pocketknife-querydsl来实现jira数据库表和插件表的联合查询)
概述
在jira插件开发过程中,数据库表的创建和数据的增删改查操作是使用ActiveObject模块完成的。但是,ao模块只能操作插件生成的表,无法和jira的内置表做关联查询操作。
然而作为jira的插件,很多时候,数据是需要和jira的数据进行关联查询的。
jira内置的api,其实提供了不同表之间关联查询的操作,使用的依赖是jira-core里引用的querydsl-sql。
关于querydsl,其实是一个第三方的开源数据库框架,项目地址:https://github.com/querydsl/querydsl。
jira内部,也是有很多地方使用这种方式进行查询的,比如关于worklog的查询:
atlassian官方也在此基础上封装了方便开发者使用的工具包:atlassian-pocketknife-querydsl,项目地址:https://bitbucket.org/atlassian/atlassian-pocketknife-querydsl/src/master/。
使用
按道理来讲,使用jira内置的querydsl应该也是能完成jira表和插件表的联合查询的。但是在实际使用过程中,一直有报错。尝试许久还是无法解决(大家可以自行尝试,可能是我哪里没配置好),所以这里演示的是以atlassian-pocketknife-querydsl为例查询。
pom文件改动
使用atlassian-pocketknife-querydsl,首先需要在pom文件里引用这个依赖。由于jira7和8版本api的不同,atlassian-pocketknife-querydsl的引用版本也有所区别(主要是jira7里的com.atlassian.fugue.Option类路径改到了io.atlassian.fugue.Option )。
在jira7.*以前的环境里,需要引用的是atlassian-pocketknife-querydsl 4.*以前的版本;在Jira 8.*以后的版本,需要引用的是atlassian-pocketknife-querydsl 5.*以后的版本
下面说下,pom文件的改用内容:
在pom文件里加入依赖:
<dependency> <groupId>com.atlassian.pocketknife</groupId> <artifactId>atlassian-pocketknife-querydsl</artifactId> <version>4.0.0</version> <scope>compile</scope> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </exclusion> <exclusion> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> </exclusion> <exclusion> <groupId>com.google.code.findbugs</groupId> <artifactId>jsr305</artifactId> </exclusion> <exclusion> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> </exclusion> </exclusions> </dependency> |
在plugin:atlassian-spring-scanner-maven-plugin里,加入对atlassian-pocketknife-querydsl包的扫描
<plugin> <groupId>com.atlassian.plugin</groupId> <artifactId>atlassian-spring-scanner-maven-plugin</artifactId> <version>${atlassian.spring.scanner.version}</version> <executions> <execution> <goals> <goal>atlassian-spring-scanner</goal> </goals> <phase>process-classes</phase> </execution> </executions> <configuration> <scannedDependencies> <dependency> <groupId>com.atlassian.plugin</groupId> <artifactId>atlassian-spring-scanner-external-jar</artifactId> </dependency> <dependency> <groupId>com.atlassian.pocketknife</groupId> <artifactId>atlassian-pocketknife-querydsl</artifactId> </dependency> </scannedDependencies> <verbose>false</verbose> </configuration> </plugin> |
在build-》plugin-》jira-maven-plugin里排除掉队querydsl pocketknife的一些引用,
<plugin> <groupId>com.atlassian.maven.plugins</groupId> <artifactId>jira-maven-plugin</artifactId> <version>${amps.version}</version> <extensions>true</extensions> <configuration> <productVersion>${jira.version}</productVersion> <productDataVersion>${jira.version}</productDataVersion> <jvmArgs>-Xms1g -Xmx1500m -XX:MaxPermSize=1g -XX:-UseGCOverheadLimit -server -Datlassian.mail.senddisabled=false</jvmArgs> <enableQuickReload>true</enableQuickReload> <allowGoogleTracking>false</allowGoogleTracking> <skipRestDocGeneration>true</skipRestDocGeneration> <instructions> <Atlassian-Plugin-Key>${atlassian.plugin.key}</Atlassian-Plugin-Key> <!-- Add package to export here --> <Export-Package> com.shdsd.plugin.organizationPro.api;version="${project.version}",</Export-Package> <!-- Add package import here --> <Atlassian-Scan-Folders>META-INF/plugin-descriptors</Atlassian-Scan-Folders> <Import-Package> <!-- imports --> org.springframework.osgi.*;resolution:="optional", org.eclipse.gemini.blueprint.*;resolution:="optional", <!-- spring imports --> org.springframework.aop, org.springframework.core, <!-- jira stuff --> com.atlassian.jira.plugin.webfragment.conditions, com.atlassian.jira.issue.customfields.searchers, com.atlassian.jira.jql.operand, <!-- required for spring lifecycle annotations --> <!--javax.annotation,--> <!-- exclude stuff for querydsl pocketknife 主要是下面两行--> !net.sf.cglib.proxy, !org.jvnet.hudson.annotation_indexer, <!-- everything else --> *;resolution:=optional </Import-Package> <Require-Bundle>org.apache.felix.framework</Require-Bundle> <!-- Ensure plugin is spring powered --> <Spring-Context>*</Spring-Context> </instructions> </configuration> </plugin> |
代码里使用
关于querysql的使用,可以先去网上查找相关资料;
querysql的使用,需要建一些继承com.querydsl.sql.RelationalPathBase的类。jira的api里已经定义了对jira系统表的一些类,比如com.atlassian.jira.model.querydsl.QWorklog,其他类,在此类的同级包下。
插件里的类,也需要这样定义一下,比如组织机构里的雇员类,需要定义一个 QEmployee类,
import com.atlassian.pocketknife.spi.querydsl.EnhancedRelationalPathBase; import com.querydsl.core.types.dsl.BooleanPath; import com.querydsl.core.types.dsl.NumberPath; import com.querydsl.core.types.dsl.StringPath; /** * 2021/2/3 16:56 * Created by chenq */ public class QEmployee extends EnhancedRelationalPathBase<QEmployee> { public static final QEmployee EMPLOYEE = new QEmployee(); public final NumberPath<Integer> ID = createIntegerCol("ID").asPrimaryKey().build(); public final StringPath JIRA_USER_KEY = createStringCol("JIRA_USER_KEY").build(); public final BooleanPath DELETED = createBooleanCol("DELETED").build(); public final NumberPath<Integer> DEPT_ID = createIntegerCol("DEPT_ID").build(); public QEmployee() { super(QEmployee.class, "AO_67ABB4_EMPLOYEE"); } } |
在实际操作中,直接使用jira内置定义好的QWorklog会有问题,所以,我们再重新定义一下QWorklog这个类;
import com.atlassian.jira.model.querydsl.WorklogDTO; import com.atlassian.pocketknife.spi.querydsl.EnhancedRelationalPathBase; import com.querydsl.core.types.dsl.DateTimePath; import com.querydsl.core.types.dsl.NumberPath; import com.querydsl.core.types.dsl.StringPath; import java.sql.Timestamp; /** * 2021/2/5 10:58 * Created by chenq */ public class QWorklog extends EnhancedRelationalPathBase<WorklogDTO> { public static final QWorklog WORKLOG = new QWorklog(); public final NumberPath<Long> id = createNumber("id", Long.class); public final NumberPath<Long> issue = createNumber("issueid", Long.class); public final StringPath author = createString("author"); public final StringPath grouplevel = createString("grouplevel"); public final NumberPath<Long> rolelevel = createNumber("rolelevel", Long.class); public final StringPath body = createString("worklogbody"); public final DateTimePath<Timestamp> created = createDateTime("created", java.sql.Timestamp.class); public final StringPath updateauthor = createString("updateauthor"); public final DateTimePath<java.sql.Timestamp> updated = createDateTime("updated", java.sql.Timestamp.class); public final DateTimePath<java.sql.Timestamp> startdate = createDateTime("startdate", java.sql.Timestamp.class); public final NumberPath<Long> timeworked = createNumber("timeworked", Long.class); public QWorklog() { super(WorklogDTO.class, "worklog"); } } |
查询(以worklog关联雇员表查询数据操作实例)
List<WorklogDTO> worklogDTOList = databaseAccessor.run(con -> { SQLQuery<WorklogDTO> worklogDTOSQLQuery = con.query().select(QWorklog.WORKLOG).from(QWorklog.WORKLOG).join(QEmployee.EMPLOYEE) .on(QWorklog.WORKLOG.author.eq(QEmployee.EMPLOYEE.JIRA_USER_KEY)).where(QWorklog.WORKLOG.author.eq("admin")); return worklogDTOSQLQuery.fetch(); }); |
使用querydsl,可以实现原生sql的查询功能,更多功能可以查找querydsl的使用方法。
posted on 2021-02-09 18:39 Sunshine-jcy 阅读(1209) 评论(0) 编辑 收藏 举报