Querydsl是一个采用API代替拼凑字符串来构造查询语句,可跟 Hibernate 和 JPA 等框架结合使用。本文介绍的是非spring环境下querydsl JPA整合使用,感兴趣的小伙伴们可以参考一下
querydsl是一个采用api代替拼凑字符串来构造查询语句,可跟 hibernate 和 jpa 等框架结合使用。网上很多教程都是结合spring jpa框架下使用的教程,本文介绍的是非spring环境下querydsl jpa整合使用。
1、使用eclipse生成jpa实体类,idea也能生成同样jpa实体类。
鼠标右键打开jpa tools工具:
创建数据库链接:
选择那些数据库表需要生成jpa实体类:
关联表生成:
设置实体生成属性:
单个实体属性修改
生成的jpa实体类adminlog.javapackage com.test.db.entity;
import java.io.serializable;
import javax.persistence.*;
import java.util.date;
/**
* the persistent class for the admin_log database table.
*
*/
@entity
@table(name="admin_log")
@namedquery(name="adminlog.findall", query="select a from adminlog a")
public class adminlog implements serializable {
private static final long serialversionuid = 1l;
@id
@generatedvalue(strategy=generationtype.auto)
@column(unique=true, nullable=false)
private string id;
@column(name="action_id", length=20)
private string actionid;
@column(name="client_ip", length=15)
private string clientip;
@column(name="controller_id", length=20)
private string controllerid;
@temporal(temporaltype.timestamp)
@column(name="create_date")
private date createdate;
@column(name="create_user", length=50)
private string createuser;
@column(name="func_name", length=50)
private string funcname;
@column(name="module_name", length=50)
private string modulename;
@column(name="right_name", length=50)
private string rightname;
@column(length=200)
private string url;
public adminlog() {
}
public string getid() {
return this.id;
}
public void setid(string id) {
this.id = id;
}
public string getactionid() {
return this.actionid;
}
public void setactionid(string actionid) {
this.actionid = actionid;
}
public string getclientip() {
return this.clientip;
}
public void setclientip(string clientip) {
this.clientip = clientip;
}
public string getcontrollerid() {
return this.controllerid;
}
public void setcontrollerid(string controllerid) {
this.controllerid = controllerid;
}
public date getcreatedate() {
return this.createdate;
}
public void setcreatedate(date createdate) {
this.createdate = createdate;
}
public string getcreateuser() {
return this.createuser;
}
public void setcreateuser(string createuser) {
this.createuser = createuser;
}
public string getfuncname() {
return this.funcname;
}
public void setfuncname(string funcname) {
this.funcname = funcname;
}
public string getmodulename() {
return this.modulename;
}
public void setmodulename(string modulename) {
this.modulename = modulename;
}
public string getrightname() {
return this.rightname;
}
public void setrightname(string rightname) {
this.rightname = rightname;
}
public string geturl() {
return this.url;
}
public void seturl(string url) {
this.url = url;
}
}
2、生成querydsl查询类
maven pom.xml文件<project xmlns="http://maven.apache.org/pom/4.0.0"
xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"
xsi:schemalocation="http://maven.apache.org/pom/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelversion>4.0.0</modelversion>
<groupid>com.test.db</groupid>
<artifactid>dbtest</artifactid>
<packaging>jar</packaging>
<version>1.0-snapshot</version>
<name>dbtest</name>
<url>http://maven.apache.org</url>
<properties>
<querydsl.version>4.2.1</querydsl.version>
</properties>
<dependencies>
<dependency>
<groupid>junit</groupid>
<artifactid>junit</artifactid>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupid>com.querydsl</groupid>
<artifactid>querydsl-sql</artifactid>
<version>${querydsl.version}</version>
</dependency>
<dependency>
<groupid>com.querydsl</groupid>
<artifactid>querydsl-apt</artifactid>
<version>${querydsl.version}</version>
</dependency>
<dependency>
<groupid>com.querydsl</groupid>
<artifactid>querydsl-jpa</artifactid>
<version>${querydsl.version}</version>
</dependency>
<dependency>
<groupid>com.querydsl</groupid>
<artifactid>querydsl-sql-codegen</artifactid>
<version>${querydsl.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupid>org.eclipse.persistence</groupid>
<artifactid>org.eclipse.persistence.jpa</artifactid>
<version>2.6.0</version>
</dependency>
<dependency>
<groupid>org.slf4j</groupid>
<artifactid>slf4j-log4j12</artifactid>
<version>1.6.1</version>
</dependency>
<dependency>
<groupid>mysql</groupid>
<artifactid>mysql-connector-java</artifactid>
<version>8.0.11</version>
</dependency>
<dependency>
<groupid>com.alibaba</groupid>
<artifactid>druid</artifactid>
<version>1.1.10</version>
</dependency>
<dependency>
<groupid>org.hibernate</groupid>
<artifactid>hibernate-entitymanager</artifactid>
<version>5.4.0.final</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- 生成jpa实体插件 -->
<plugin>
<groupid>com.querydsl</groupid>
<artifactid>querydsl-maven-plugin</artifactid>
<version>${querydsl.version}</version>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>jpa-export</goal>
</goals>
<configuration>
<targetfolder>${project.basedir}/target/generated-sources/java</targetfolder>
<packages>com.test.db.entity</packages>
</configuration>
</execution>
</executions>
</plugin>
<!-- 生成jpa实体插件 -->
<!--
<plugin>
<groupid>com.mysema.maven</groupid>
<artifactid>apt-maven-plugin</artifactid>
<version>1.1.3</version>
<executions>
<execution>
<goals>
<goal>process</goal>
</goals>
<configuration>
<outputdirectory>target/generated-sources/java</outputdirectory>
<processor>com.querydsl.apt.jpa.jpaannotationprocessor</processor>
</configuration>
</execution>
</executions>
</plugin>
-->
<plugin>
<groupid>org.apache.maven.plugins</groupid>
<artifactid>maven-compiler-plugin</artifactid>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>utf-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
执行命令mvn compile或mvn eclipse:eclipse生成jpa实体对应的querydsl查询类
adminlog.java对应的querydsl对应查询类package com.test.db.entity;
import static com.querydsl.core.types.pathmetadatafactory.*;
import com.querydsl.core.types.dsl.*;
import com.querydsl.core.types.pathmetadata;
import javax.annotation.generated;
import com.querydsl.core.types.path;
/**
* qadminlog is a querydsl query type for adminlog
*/
@generated("com.querydsl.codegen.entityserializer")
public class qadminlog extends entitypathbase<adminlog> {
private static final long serialversionuid = 392071999l;
public static final qadminlog adminlog = new qadminlog("adminlog");
public final stringpath actionid = createstring("actionid");
public final stringpath clientip = createstring("clientip");
public final stringpath controllerid = createstring("controllerid");
public final datetimepath<java.util.date> createdate = createdatetime("createdate", java.util.date.class);
public final stringpath createuser = createstring("createuser");
public final stringpath funcname = createstring("funcname");
public final stringpath id = createstring("id");
public final stringpath modulename = createstring("modulename");
public final stringpath rightname = createstring("rightname");
public final stringpath url = createstring("url");
public qadminlog(string variable) {
super(adminlog.class, forvariable(variable));
}
public qadminlog(path<? extends adminlog> path) {
super(path.gettype(), path.getmetadata());
}
public qadminlog(pathmetadata metadata) {
super(adminlog.class, metadata);
}
}
3、查询例子
jpa持久化meta-inf\persistence.xml配置文件,entitymanagerfactory创建实例时,需要读取该配置文件:<?xml version="1.0" encoding="utf-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"
xsi:schemalocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="jpa" transaction-type="resource_local">
<provider>org.hibernate.ejb.hibernatepersistence</provider>
<properties>
<!-- .mysqlinnodbdialect -->
<property name="hibernate.dialect" value="org.hibernate.dialect.mysql8dialect"/>
<property name="javax.persistence.jdbc.driver" value="com.mysql.cj.jdbc.driver" />
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://127.0.0.1:3306/yiiboot?useunicode=true&characterencoding=utf-8&servertimezone=asia/shanghai&usessl=true" />
<property name="javax.persistence.jdbc.user" value="root" />
<property name="javax.persistence.jdbc.password" value="123" />
<property name="connection.provider_class" value="com.alibaba.druid.support.hibernate.druidconnectionprovider" />
<!-- 配置初始化大小、最小、最大 -->
<property name="initialsize" value="1" />
<property name="minidle" value="1" />
<property name="maxactive" value="20" />
<!-- 配置获取连接等待超时的时间 -->
<property name="maxwait" value="60000" />
<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name="timebetweenevictionrunsmillis" value="60000" />
<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<property name="minevictableidletimemillis" value="300000" />
</properties>
</persistence-unit>
</persistence>
测试代码package com.test.db.main;
import java.util.list;
import javax.persistence.entitymanagerfactory;
import javax.persistence.persistence;
import com.querydsl.jpa.impl.jpaqueryfactory;
import com.test.db.entity.adminmodule;
import com.test.db.entity.qadminmodule;
public class jpatest {
public static void main(string[] args) throws exception{
string persistenceunitname = "jpa";
entitymanagerfactory entitymanagerfactory =
persistence.createentitymanagerfactory(persistenceunitname);
jpaqueryfactory queryfactory = new jpaqueryfactory(entitymanagerfactory.createentitymanager());
qadminmodule adminmodule = qadminmodule.adminmodule;
list<adminmodule> list = queryfactory.selectfrom(adminmodule).fetch();
list.foreach(module->{
system.out.println(module.getid() + "," + module.getdisplaylabel() + "," + module.getcreatedate());
});
}
}
querydsl官方文档:http://www.querydsl.com/static/querydsl/latest/reference/html/ch02.html#jpa_integration
java类库:https://www.21doc.net/java/awesomejava#database
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持CodeAE代码之家 。
原文链接:https://my.oschina.net/penngo/blog/2998232