Skip to content

Commit 2e8e4e4

Browse files
Merge pull request #16094 from sIvanovKonstantyn/master
BAEL-6163 - Examples for the article "Querydsl vs. JPA Criteria"
2 parents a8fe086 + db287fa commit 2e8e4e4

File tree

8 files changed

+546
-6
lines changed

8 files changed

+546
-6
lines changed

persistence-modules/querydsl/pom.xml

+41-6
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,18 @@
1515
</parent>
1616

1717
<dependencies>
18+
<!-- Spring Data -->
19+
<dependency>
20+
<groupId>org.springframework.boot</groupId>
21+
<artifactId>spring-boot-starter-data-jpa</artifactId>
22+
<version>${spring-boot.version}</version>
23+
</dependency>
24+
<dependency>
25+
<groupId>org.springframework.boot</groupId>
26+
<artifactId>spring-boot-starter-test</artifactId>
27+
<scope>test</scope>
28+
<version>${spring-boot.version}</version>
29+
</dependency>
1830
<!-- QueryDSL -->
1931
<dependency>
2032
<groupId>com.querydsl</groupId>
@@ -36,6 +48,16 @@
3648
<version>${hibernate-core.version}</version>
3749
<scope>compile</scope>
3850
</dependency>
51+
<dependency>
52+
<groupId>org.hibernate</groupId>
53+
<artifactId>hibernate-jpamodelgen</artifactId>
54+
<version>${hibernate-core.version}</version>
55+
</dependency>
56+
<dependency>
57+
<groupId>org.bsc.maven</groupId>
58+
<artifactId>maven-processor-plugin</artifactId>
59+
<version>5.0</version>
60+
</dependency>
3961
<dependency>
4062
<groupId>commons-dbcp</groupId>
4163
<artifactId>commons-dbcp</artifactId>
@@ -103,24 +125,36 @@
103125
<version>${maven-compiler-plugin.version}</version>
104126
<configuration>
105127
<compilerArgument>-proc:none</compilerArgument>
128+
<source>17</source>
129+
<target>17</target>
106130
</configuration>
107131
</plugin>
108-
<!-- QueryDSL plugin -->
109132
<plugin>
110-
<groupId>com.mysema.maven</groupId>
111-
<artifactId>apt-maven-plugin</artifactId>
112-
<version>${apt-maven-plugin.version}</version>
133+
<groupId>org.bsc.maven</groupId>
134+
<artifactId>maven-processor-plugin</artifactId>
135+
<version>5.0</version>
113136
<executions>
114137
<execution>
138+
<id>process</id>
115139
<goals>
116140
<goal>process</goal>
117141
</goals>
142+
<phase>generate-sources</phase>
118143
<configuration>
119-
<outputDirectory>target/generated-sources/java</outputDirectory>
120-
<processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
144+
<processors>
145+
<processor>org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor</processor>
146+
<processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
147+
</processors>
121148
</configuration>
122149
</execution>
123150
</executions>
151+
<dependencies>
152+
<dependency>
153+
<groupId>org.hibernate</groupId>
154+
<artifactId>hibernate-jpamodelgen</artifactId>
155+
<version>${hibernate-core.version}</version>
156+
</dependency>
157+
</dependencies>
124158
</plugin>
125159
</plugins>
126160
</build>
@@ -132,6 +166,7 @@
132166
<commons-dbcp.version>1.4</commons-dbcp.version>
133167
<apt-maven-plugin.version>1.1.3</apt-maven-plugin.version>
134168
<hibernate-core.version>6.4.2.Final</hibernate-core.version>
169+
<spring-boot.version>3.2.3</spring-boot.version>
135170
</properties>
136171

137172
</project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package com.baeldung.querydslvsjpacriteria.entities;
2+
3+
import java.util.HashSet;
4+
import java.util.Set;
5+
6+
import jakarta.persistence.CascadeType;
7+
import jakarta.persistence.Entity;
8+
import jakarta.persistence.GeneratedValue;
9+
import jakarta.persistence.Id;
10+
import jakarta.persistence.ManyToMany;
11+
import jakarta.persistence.OneToMany;
12+
13+
@Entity
14+
public class GroupUser {
15+
16+
@Id
17+
@GeneratedValue
18+
private Long id;
19+
20+
private String login;
21+
22+
@ManyToMany(mappedBy = "groupUsers", cascade = CascadeType.PERSIST)
23+
private Set<UserGroup> userGroups = new HashSet<>();
24+
25+
@OneToMany(cascade = CascadeType.PERSIST, mappedBy = "groupUser")
26+
private Set<Task> tasks = new HashSet<>(0);
27+
28+
public Long getId() {
29+
return id;
30+
}
31+
32+
public void setId(Long id) {
33+
this.id = id;
34+
}
35+
36+
public String getLogin() {
37+
return login;
38+
}
39+
40+
public void setLogin(String login) {
41+
this.login = login;
42+
}
43+
44+
public Set<UserGroup> getUserGroups() {
45+
return userGroups;
46+
}
47+
48+
public void setUserGroups(Set<UserGroup> userGroups) {
49+
this.userGroups = userGroups;
50+
}
51+
52+
public Set<Task> getTasks() {
53+
return tasks;
54+
}
55+
56+
public void setTasks(Set<Task> tasks) {
57+
this.tasks = tasks;
58+
}
59+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.baeldung.querydslvsjpacriteria.entities;
2+
3+
import jakarta.persistence.Entity;
4+
import jakarta.persistence.GeneratedValue;
5+
import jakarta.persistence.Id;
6+
import jakarta.persistence.ManyToOne;
7+
8+
@Entity
9+
public class Task {
10+
11+
@Id
12+
@GeneratedValue
13+
private Long id;
14+
15+
private String description;
16+
17+
@ManyToOne
18+
private GroupUser groupUser;
19+
20+
public Long getId() {
21+
return id;
22+
}
23+
24+
public void setId(Long id) {
25+
this.id = id;
26+
}
27+
28+
public String getDescription() {
29+
return description;
30+
}
31+
32+
public void setDescription(String description) {
33+
this.description = description;
34+
}
35+
36+
public GroupUser getUser() {
37+
return groupUser;
38+
}
39+
40+
public void setUser(GroupUser groupUser) {
41+
this.groupUser = groupUser;
42+
}
43+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package com.baeldung.querydslvsjpacriteria.entities;
2+
3+
import java.util.HashSet;
4+
import java.util.Set;
5+
6+
import jakarta.persistence.CascadeType;
7+
import jakarta.persistence.Entity;
8+
import jakarta.persistence.GeneratedValue;
9+
import jakarta.persistence.Id;
10+
import jakarta.persistence.ManyToMany;
11+
12+
@Entity
13+
public class UserGroup {
14+
15+
@Id
16+
@GeneratedValue
17+
private Long id;
18+
19+
private String name;
20+
21+
@ManyToMany(cascade = CascadeType.PERSIST)
22+
private Set<GroupUser> groupUsers = new HashSet<>();
23+
24+
public Long getId() {
25+
return id;
26+
}
27+
28+
public void setId(Long id) {
29+
this.id = id;
30+
}
31+
32+
public String getName() {
33+
return name;
34+
}
35+
36+
public void setName(String name) {
37+
this.name = name;
38+
}
39+
40+
public Set<GroupUser> getGroupUsers() {
41+
return groupUsers;
42+
}
43+
44+
public void setGroupUsers(Set<GroupUser> groupUsers) {
45+
this.groupUsers = groupUsers;
46+
}
47+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.baeldung.querydslvsjpacriteria.repositories;
2+
3+
import java.util.List;
4+
5+
import org.springframework.data.jpa.domain.Specification;
6+
import org.springframework.data.jpa.repository.JpaRepository;
7+
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
8+
9+
import com.baeldung.querydslvsjpacriteria.entities.UserGroup;
10+
import com.baeldung.querydslvsjpacriteria.entities.UserGroup_;
11+
12+
public interface UserGroupJpaSpecificationRepository extends JpaRepository<UserGroup, Long>,
13+
JpaSpecificationExecutor<UserGroup> {
14+
15+
default List<UserGroup> findAllWithNameInAnyList(List<String> names1, List<String> names2) {
16+
return findAll(specNameInAnyList(names1, names2));
17+
}
18+
19+
default Specification<UserGroup> specNameInAnyList(List<String> names1, List<String> names2) {
20+
return (root, q, cb) -> cb.or(
21+
root.get(UserGroup_.name).in(names1),
22+
root.get(UserGroup_.name).in(names2)
23+
);
24+
}
25+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.baeldung.querydslvsjpacriteria.repositories;
2+
3+
import java.util.List;
4+
import java.util.stream.Collectors;
5+
import java.util.stream.StreamSupport;
6+
7+
import org.springframework.data.jpa.repository.JpaRepository;
8+
import org.springframework.data.querydsl.QuerydslPredicateExecutor;
9+
10+
import com.baeldung.querydslvsjpacriteria.entities.QUserGroup;
11+
import com.baeldung.querydslvsjpacriteria.entities.UserGroup;
12+
import com.querydsl.core.BooleanBuilder;
13+
import com.querydsl.core.types.Predicate;
14+
15+
public interface UserGroupQuerydslPredicateRepository extends JpaRepository<UserGroup, Long>, QuerydslPredicateExecutor<UserGroup> {
16+
17+
default List<UserGroup> findAllWithNameInAnyList(List<String> names1, List<String> names2) {
18+
return StreamSupport
19+
.stream(findAll(predicateInAnyList(names1, names2)).spliterator(), false)
20+
.collect(Collectors.toList());
21+
}
22+
23+
default Predicate predicateInAnyList(List<String> names1, List<String> names2) {
24+
return new BooleanBuilder().and(QUserGroup.userGroup.name.in(names1))
25+
.or(QUserGroup.userGroup.name.in(names2));
26+
}
27+
}

0 commit comments

Comments
 (0)