springData使用QueryDsl的示例代码

2025-05-29 0 37

经过多年,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

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136
<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类

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20
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类

?

1

2

3

4

5

6

7

8
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);

}

?

1

2

3

4

5

6

7

8

9
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.配置类

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83
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.测试类

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45
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);

}

}

}

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36
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

?

1

2

3

4
@bean

public jpaqueryfactory jpaqueryfactory(entitymanager entitymanager) {

return new jpaqueryfactory(new hqltemplates(), entitymanager);

}

2.建一个dto(数据传输对象)

?

1

2

3

4

5

6
public class userdto {

private string empname;

private string deptname;

private long salary;

//setter,getter略

}

3.查询例子测试

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31
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/

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持快网idc。

原文链接:https://blog.csdn.net/xiejx618/article/details/51480265

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 springData使用QueryDsl的示例代码 https://www.kuaiidc.com/109630.html

相关文章

发表评论
暂无评论