三叶草 发表于 2021-10-6 10:14:37

详解非spring框架下使用querydsl的方法

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.java


package 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

http://www.zzvips.com/article/174515.html
页: [1]
查看完整版本: 详解非spring框架下使用querydsl的方法