这篇文章主要介绍了springData使用QueryDsl的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
经过多年,spring data jpa越来越完善,在版本迭代的过程中,会不断增加功能,今天看新的reference发现有querydsl.然后搜索到上面的参考资料2
无论是jpaspecificationexecutor,还是querydslpredicateexecutor,它俩都提供了使用predicate(意义相同,都是构建where子句;类不同,javax.persistence.criteria.predicate,com.querydsl.core.types.predicate)去构建查询,使用比较方便.
关于两者的简单使用,上面的参考资料2有介绍.文末也有总结,从概括来看,我个人认为应倾向使用querydslpredicateexecutor,querydsl不仅适用于jpa repositories,还支持mongodb.
下面是个例子
1.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/xsd/maven-4.0.0.xsd">
<modelversion>4.0.0</modelversion>
<groupid>org.exam</groupid>
<artifactid>testjava</artifactid>
<version>1.0.0</version>
<name>${project.artifactid}</name>
<properties>
<project.build.sourceencoding>utf-8</project.build.sourceencoding>
<project.reporting.outputencoding>utf-8</project.reporting.outputencoding>
<java.version>1.8</java.version>
<spring.version>4.2.5.release</spring.version>
<spring-data.version>hopper-sr1</spring-data.version>
<querydsl.version>4.1.1</querydsl.version>
<hibernate.version>5.1.0.final</hibernate.version>
<tomcat.version>8.0.32</tomcat.version>
<logback.version>1.1.7</logback.version>
<mysql.version>5.1.33</mysql.version>
<junit.version>4.12</junit.version>
</properties>
<dependencymanagement>
<dependencies>
<dependency>
<groupid>org.springframework</groupid>
<artifactid>spring-framework-bom</artifactid>
<version>${spring.version}</version>
<scope>import</scope>
<type>pom</type>
</dependency>
<dependency>
<groupid>org.springframework.data</groupid>
<artifactid>spring-data-releasetrain</artifactid>
<version>${spring-data.version}</version>
<scope>import</scope>
<type>pom</type>
</dependency>
</dependencies>
</dependencymanagement>
<build>
<plugins>
<plugin>
<groupid>org.apache.maven.plugins</groupid>
<artifactid>maven-compiler-plugin</artifactid>
<version>3.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
<plugin>
<groupid>com.mysema.maven</groupid>
<artifactid>maven-apt-plugin</artifactid>
<version>1.0.4</version>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>process</goal>
</goals>
<configuration>
<outputdirectory>target/generated-sources</outputdirectory>
<processor>com.querydsl.apt.jpa.jpaannotationprocessor</processor>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupid>org.springframework.data</groupid>
<artifactid>spring-data-jpa</artifactid>
</dependency>
<dependency>
<groupid>org.springframework.data</groupid>
<artifactid>spring-data-mongodb</artifactid>
</dependency>
<dependency>
<groupid>com.querydsl</groupid>
<artifactid>querydsl-apt</artifactid>
<version>${querydsl.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupid>com.querydsl</groupid>
<artifactid>querydsl-jpa</artifactid>
<version>${querydsl.version}</version>
</dependency>
<dependency>
<groupid>com.querydsl</groupid>
<artifactid>querydsl-mongodb</artifactid>
<version>${querydsl.version}</version>
</dependency>
<dependency>
<groupid>org.hibernate</groupid>
<artifactid>hibernate-entitymanager</artifactid>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupid>org.apache.tomcat</groupid>
<artifactid>tomcat-jdbc</artifactid>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupid>org.springframework</groupid>
<artifactid>spring-test</artifactid>
</dependency>
<dependency>
<groupid>ch.qos.logback</groupid>
<artifactid>logback-classic</artifactid>
<version>${logback.version}</version>
</dependency>
<dependency>
<groupid>mysql</groupid>
<artifactid>mysql-connector-java</artifactid>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupid>junit</groupid>
<artifactid>junit</artifactid>
<version>${junit.version}</version>
</dependency>
</dependencies>
<repositories>
<repository>
<id>central</id>
<name>central repository</name>
<url>http://repo1.maven.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project> 2.domain类package org.exam.domain;
import org.springframework.data.mongodb.core.mapping.document;
import javax.persistence.column;
import javax.persistence.entity;
import javax.persistence.id;
import java.io.serializable;
@entity
@document
public class employee implements serializable {
@id
@column(length = 38)
private string id;
@column(length = 32)
private string name;
private long salary;
private long departmentid;
//setter和getter略
} 3.repository类package org.exam.repository.jpa;
import org.exam.domain.employee;
import org.springframework.data.querydsl.querydslpredicateexecutor;
import org.springframework.data.repository.pagingandsortingrepository;
import java.util.collection;
public interface jpaemployeerepository extends pagingandsortingrepository<employee,string>,querydslpredicateexecutor<employee>{
collection<employee> findbyidin(collection<string> ids);
}
package org.exam.repository.mongo;
import org.exam.domain.employee;
import org.springframework.data.querydsl.querydslpredicateexecutor;
import org.springframework.data.repository.pagingandsortingrepository;
import java.util.collection;
public interface mongoemployeerepository extends pagingandsortingrepository<employee, string>, querydslpredicateexecutor<employee> {
collection<employee> findbyidin(collection<string> ids);
} jpa有jparepository,mongodb有mongorepository,它俩都继承pagingandsortingrepository
3.配置类package org.exam.config;
import com.mongodb.mongoclient;
import com.mongodb.writeconcern;
import org.apache.tomcat.jdbc.pool.datasource;
import org.springframework.context.annotation.bean;
import org.springframework.context.annotation.configuration;
import org.springframework.context.annotation.propertysource;
import org.springframework.core.env.environment;
import org.springframework.data.jpa.repository.config.enablejparepositories;
import org.springframework.data.mongodb.mongodbfactory;
import org.springframework.data.mongodb.core.mongotemplate;
import org.springframework.data.mongodb.core.simplemongodbfactory;
import org.springframework.data.mongodb.core.writeresultchecking;
import org.springframework.data.mongodb.repository.config.enablemongorepositories;
import org.springframework.orm.jpa.jpatransactionmanager;
import org.springframework.orm.jpa.localcontainerentitymanagerfactorybean;
import org.springframework.orm.jpa.vendor.database;
import org.springframework.orm.jpa.vendor.hibernatejpavendoradapter;
import org.springframework.transaction.platformtransactionmanager;
import org.springframework.transaction.annotation.enabletransactionmanagement;
import javax.annotation.resource;
import java.net.unknownhostexception;
import java.util.properties;
@configuration
@propertysource("classpath:config.properties")
@enabletransactionmanagement
@enablejparepositories(basepackages = "org.exam.repository.jpa")
@enablemongorepositories(basepackages = "org.exam.repository.mongo")
public class appconfig {
@resource
private environment env;
@bean(destroymethod = "close")
public datasource datasource() {
datasource datasource = new datasource();
datasource.setdriverclassname(env.getproperty("ds.driverclassname"));
datasource.seturl(env.getproperty("ds.url"));
datasource.setusername(env.getproperty("ds.username"));
datasource.setpassword(env.getproperty("ds.password"));
datasource.setinitialsize(env.getproperty("ds.initialsize", integer.class));
datasource.setminidle(env.getproperty("ds.minidle", integer.class));
datasource.setmaxidle(env.getproperty("ds.maxidle", integer.class));
datasource.setmaxactive(env.getproperty("ds.maxactive", integer.class));
return datasource;
}
@bean
public localcontainerentitymanagerfactorybean entitymanagerfactory() {
hibernatejpavendoradapter jpavendoradapter = new hibernatejpavendoradapter();
jpavendoradapter.setdatabase(database.valueof(env.getproperty("jpa.database")));
jpavendoradapter.setgenerateddl(env.getproperty("jpa.generateddl",boolean.class));
jpavendoradapter.setshowsql(env.getproperty("jpa.showsql",boolean.class));
localcontainerentitymanagerfactorybean emf = new localcontainerentitymanagerfactorybean();
emf.setdatasource(datasource());
emf.setpackagestoscan("org.exam.domain");
emf.setjpavendoradapter(jpavendoradapter);
properties properties = new properties();
properties.setproperty("hibernate.default_schema", env.getproperty("jpa.defaultschema"));
emf.setjpaproperties(properties);
return emf;
}
@bean
public platformtransactionmanager transactionmanager() {
return new jpatransactionmanager(entitymanagerfactory().getobject());
}
@bean
public mongodbfactory mongodbfactory() throws unknownhostexception {
return new simplemongodbfactory(new mongoclient(env.getproperty("mongo.host"), env.getproperty("mongo.port", integer.class)), env.getproperty("mongo.db"));
}
@bean
public mongotemplate mongotemplate() throws unknownhostexception {
mongotemplate mongotemplate = new mongotemplate(mongodbfactory());
mongotemplate.setwriteresultchecking(writeresultchecking.exception);
mongotemplate.setwriteconcern(writeconcern.normal);
return mongotemplate;
}
} 4.测试类package org.exam.repository.jpa;
import org.exam.config.appconfig;
import org.exam.domain.employee;
import org.junit.test;
import org.junit.runner.runwith;
import org.springframework.beans.factory.annotation.autowired;
import org.springframework.data.domain.page;
import org.springframework.data.domain.pagerequest;
import org.springframework.test.annotation.rollback;
import org.springframework.test.context.contextconfiguration;
import org.springframework.test.context.junit4.springjunit4classrunner;
import org.springframework.test.context.support.annotationconfigcontextloader;
import org.springframework.transaction.annotation.transactional;
import java.util.uuid;
@runwith(springjunit4classrunner.class)
@contextconfiguration(loader = annotationconfigcontextloader.class, classes = {appconfig.class})
@transactional(transactionmanager = "transactionmanager")//rollback默认为true
public class jpaemployeerepositorytest {
@autowired
private jpaemployeerepository jpaemployeerepository;
@test
@rollback(false)
public void testsave() {
for (int i = 0; i < 5; i++) {
employee employee = new employee();
employee.setid(uuid.randomuuid().tostring());
employee.setname("name");
employee.setdepartmentid(1 + i);
employee.setsalary(6800 + i);
jpaemployeerepository.save(employee);
}
}
@test
public void testfindall() {
page<employee> all = jpaemployeerepository.findall(null, new pagerequest(0, 8));
for (employee employee : all) {
system.out.println("employee = " + employee);
}
}
}
package org.exam.repository.mongo;
import com.mongodb.mongoclient;
import org.exam.config.appconfig;
import org.exam.domain.employee;
import org.junit.test;
import org.junit.runner.runwith;
import org.springframework.beans.factory.annotation.autowired;
import org.springframework.data.domain.page;
import org.springframework.data.domain.pagerequest;
import org.springframework.data.geo.circle;
import org.springframework.data.mongodb.core.mongotemplate;
import org.springframework.test.context.contextconfiguration;
import org.springframework.test.context.junit4.springjunit4classrunner;
import org.springframework.test.context.support.annotationconfigcontextloader;
import java.net.unknownhostexception;
@runwith(springjunit4classrunner.class)
@contextconfiguration(loader = annotationconfigcontextloader.class, classes = {appconfig.class})
public class mongoemployeerepositorytest {
@autowired
private mongoemployeerepository mongoemployeerepository;
public static void main(string[] args) throws unknownhostexception {
mongotemplate template = new mongotemplate(new mongoclient("127.0.0.1", 27017), "test");
circle circle = new circle(-73.99171, 40.738868, 0.01);
system.out.println();
}
@test
public void testfindall() {
page<employee> all = mongoemployeerepository.findall(null, new pagerequest(0, 8));
for (employee employee : all) {
system.out.println("employee = " + employee);
}
}
} 5.其它config.properties,logback.xml文件不太重要,篇幅关系就省略.
再了解一下比较大的需求,从几张表来取几个字段的数据,返回分页排序数据.
1.在appconfig注册jpaqueryfactory bean@bean
public jpaqueryfactory jpaqueryfactory(entitymanager entitymanager) {
return new jpaqueryfactory(new hqltemplates(), entitymanager);
} 2.建一个dto(数据传输对象)public class userdto {
private string empname;
private string deptname;
private long salary;
//setter,getter略
} 3.查询例子测试private page<userdto> findall(string empname,pageable pageable) {
qemployee qemp = qemployee.employee;
qdepartment qdep = qdepartment.department;
list<predicate> criteria = new arraylist<>();
if (stringutils.hastext(empname)){
criteria.add(qemp.name.eq(empname.trim()));
}
jpaquery<?> query = jpaqueryfactory.from(qemp).innerjoin(qdep).on(qemp.deptid.eq(qdep.id)).where(criteria.toarray(new predicate[criteria.size()]));
long total = query.fetchcount();
list<userdto> content;
if (pageable == null || total > pageable.getoffset()) {
map<string, simpleexpression<?>> map = new hashmap<>();
map.put("deptname", qdep.name);
map.put("empname", qemp.name);
map.put("salary", qemp.salary);
content = querydslutils.applypagination(pageable, query).select(projections.bean(userdto.class, map)).fetch();
} else {
content = collections.emptylist();
}
return new pageimpl<>(content, pageable, total);
}
@test
public void test() {
pageable pageable = new pagerequest(0, 10, new qsort(new orderspecifier<>(order.desc, qemployee.employee.salary), new orderspecifier<>(order.asc, qdepartment.department.name)));
page<userdto> page = findall("name", pageable);
for (userdto userdto : page) {
system.out.println("userdto = " + userdto);
}
} 参考资料
1:http://docs.spring.io/spring-data/jpa/docs/1.10.x/reference/pdf/spring-data-jpa-reference.pdf
2:https://spring.io/blog/2011/04/26/advanced-spring-data-jpa-specifications-and-querydsl/
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持CodeAE代码之家。
原文链接:https://blog.csdn.net/xiejx618/article/details/51480265
|