Skip to content

Commit ef91212

Browse files
authored
Merge pull request eugenp#6957 from amit2103/BAEL-14321
[BAEL-14321] - Moved @query article code
2 parents cd9ceb0 + 3e0d324 commit ef91212

10 files changed

Lines changed: 1017 additions & 2 deletions

File tree

persistence-modules/spring-data-jpa/README.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
- [Spring JPA – Multiple Databases](http://www.baeldung.com/spring-data-jpa-multiple-databases)
77
- [Spring Data JPA – Adding a Method in All Repositories](http://www.baeldung.com/spring-data-jpa-method-in-all-repositories)
88
- [An Advanced Tagging Implementation with JPA](http://www.baeldung.com/jpa-tagging-advanced)
9-
- [Spring Data JPA @Query](http://www.baeldung.com/spring-data-jpa-query)
109
- [Spring Data Annotations](http://www.baeldung.com/spring-data-annotations)
1110
- [Spring Data Java 8 Support](http://www.baeldung.com/spring-data-java-8)
1211
- [A Simple Tagging Implementation with JPA](http://www.baeldung.com/jpa-tagging)

persistence-modules/spring-persistence-simple/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
- [DAO with Spring and Generics](https://www.baeldung.com/simplifying-the-data-access-layer-with-spring-and-java-generics)
1111
- [Transactions with Spring and JPA](https://www.baeldung.com/transaction-configuration-with-jpa-and-spring)
1212
- [Introduction to Spring Data JPA](http://www.baeldung.com/the-persistence-layer-with-spring-data-jpa)
13+
- [Spring Data JPA @Query](http://www.baeldung.com/spring-data-jpa-query)
1314

1415

1516
### Eclipse Config

persistence-modules/spring-persistence-simple/pom.xml

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,16 @@
9898
<version>${org.springframework.version}</version>
9999
<scope>test</scope>
100100
</dependency>
101-
101+
<dependency>
102+
<groupId>com.querydsl</groupId>
103+
<artifactId>querydsl-jpa</artifactId>
104+
<version>${querydsl.version}</version>
105+
</dependency>
106+
<dependency>
107+
<groupId>com.querydsl</groupId>
108+
<artifactId>querydsl-apt</artifactId>
109+
<version>${querydsl.version}</version>
110+
</dependency>
102111
</dependencies>
103112

104113
<build>
@@ -109,6 +118,25 @@
109118
<filtering>true</filtering>
110119
</resource>
111120
</resources>
121+
<plugins>
122+
<plugin>
123+
<groupId>com.mysema.maven</groupId>
124+
<artifactId>apt-maven-plugin</artifactId>
125+
<version>1.1.3</version>
126+
<executions>
127+
<execution>
128+
<phase>generate-sources</phase>
129+
<goals>
130+
<goal>process</goal>
131+
</goals>
132+
<configuration>
133+
<outputDirectory>target/generated-sources</outputDirectory>
134+
<processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
135+
</configuration>
136+
</execution>
137+
</executions>
138+
</plugin>
139+
</plugins>
112140
</build>
113141

114142
<properties>
@@ -121,6 +149,7 @@
121149
<spring-data-jpa.version>2.1.6.RELEASE</spring-data-jpa.version>
122150
<tomcat-dbcp.version>9.0.0.M26</tomcat-dbcp.version>
123151
<jta.version>1.1</jta.version>
152+
<querydsl.version>4.2.1</querydsl.version>
124153

125154
<!-- util -->
126155
<guava.version>21.0</guava.version>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
package org.baeldung.spring.data.persistence.dao.user;
2+
3+
import java.time.LocalDate;
4+
import java.util.Collection;
5+
import java.util.List;
6+
import java.util.stream.Stream;
7+
8+
import org.baeldung.spring.data.persistence.model.User;
9+
import org.springframework.data.domain.Page;
10+
import org.springframework.data.domain.Pageable;
11+
import org.springframework.data.domain.Sort;
12+
import org.springframework.data.jpa.repository.JpaRepository;
13+
import org.springframework.data.jpa.repository.Modifying;
14+
import org.springframework.data.jpa.repository.Query;
15+
import org.springframework.data.repository.query.Param;
16+
17+
public interface UserRepository extends JpaRepository<User, Integer>, UserRepositoryCustom {
18+
19+
Stream<User> findAllByName(String name);
20+
21+
@Query("SELECT u FROM User u WHERE u.status = 1")
22+
Collection<User> findAllActiveUsers();
23+
24+
@Query("select u from User u where u.email like '%@gmail.com'")
25+
List<User> findUsersWithGmailAddress();
26+
27+
@Query(value = "SELECT * FROM Users u WHERE u.status = 1", nativeQuery = true)
28+
Collection<User> findAllActiveUsersNative();
29+
30+
@Query("SELECT u FROM User u WHERE u.status = ?1")
31+
User findUserByStatus(Integer status);
32+
33+
@Query(value = "SELECT * FROM Users u WHERE u.status = ?1", nativeQuery = true)
34+
User findUserByStatusNative(Integer status);
35+
36+
@Query("SELECT u FROM User u WHERE u.status = ?1 and u.name = ?2")
37+
User findUserByStatusAndName(Integer status, String name);
38+
39+
@Query("SELECT u FROM User u WHERE u.status = :status and u.name = :name")
40+
User findUserByStatusAndNameNamedParams(@Param("status") Integer status, @Param("name") String name);
41+
42+
@Query(value = "SELECT * FROM Users u WHERE u.status = :status AND u.name = :name", nativeQuery = true)
43+
User findUserByStatusAndNameNamedParamsNative(@Param("status") Integer status, @Param("name") String name);
44+
45+
@Query("SELECT u FROM User u WHERE u.status = :status and u.name = :name")
46+
User findUserByUserStatusAndUserName(@Param("status") Integer userStatus, @Param("name") String userName);
47+
48+
@Query("SELECT u FROM User u WHERE u.name like ?1%")
49+
User findUserByNameLike(String name);
50+
51+
@Query("SELECT u FROM User u WHERE u.name like :name%")
52+
User findUserByNameLikeNamedParam(@Param("name") String name);
53+
54+
@Query(value = "SELECT * FROM users u WHERE u.name LIKE ?1%", nativeQuery = true)
55+
User findUserByNameLikeNative(String name);
56+
57+
@Query(value = "SELECT u FROM User u")
58+
List<User> findAllUsers(Sort sort);
59+
60+
@Query(value = "SELECT u FROM User u ORDER BY id")
61+
Page<User> findAllUsersWithPagination(Pageable pageable);
62+
63+
@Query(value = "SELECT * FROM Users ORDER BY id", countQuery = "SELECT count(*) FROM Users", nativeQuery = true)
64+
Page<User> findAllUsersWithPaginationNative(Pageable pageable);
65+
66+
@Modifying
67+
@Query("update User u set u.status = :status where u.name = :name")
68+
int updateUserSetStatusForName(@Param("status") Integer status, @Param("name") String name);
69+
70+
@Modifying
71+
@Query(value = "UPDATE Users u SET u.status = ? WHERE u.name = ?", nativeQuery = true)
72+
int updateUserSetStatusForNameNative(Integer status, String name);
73+
74+
@Query(value = "INSERT INTO Users (name, age, email, status, active) VALUES (:name, :age, :email, :status, :active)", nativeQuery = true)
75+
@Modifying
76+
void insertUser(@Param("name") String name, @Param("age") Integer age, @Param("email") String email, @Param("status") Integer status, @Param("active") boolean active);
77+
78+
@Modifying
79+
@Query(value = "UPDATE Users u SET status = ? WHERE u.name = ?", nativeQuery = true)
80+
int updateUserSetStatusForNameNativePostgres(Integer status, String name);
81+
82+
@Query(value = "SELECT u FROM User u WHERE u.name IN :names")
83+
List<User> findUserByNameList(@Param("names") Collection<String> names);
84+
85+
void deleteAllByCreationDateAfter(LocalDate date);
86+
87+
@Modifying(clearAutomatically = true, flushAutomatically = true)
88+
@Query("update User u set u.active = false where u.lastLoginDate < :date")
89+
void deactivateUsersNotLoggedInSince(@Param("date") LocalDate date);
90+
91+
@Modifying(clearAutomatically = true, flushAutomatically = true)
92+
@Query("delete User u where u.active = false")
93+
int deleteDeactivatedUsers();
94+
95+
@Modifying(clearAutomatically = true, flushAutomatically = true)
96+
@Query(value = "alter table USERS add column deleted int(1) not null default 0", nativeQuery = true)
97+
void addDeletedColumn();
98+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package org.baeldung.spring.data.persistence.dao.user;
2+
3+
import java.util.Collection;
4+
import java.util.List;
5+
import java.util.Set;
6+
import java.util.function.Predicate;
7+
8+
import org.baeldung.spring.data.persistence.model.User;
9+
10+
public interface UserRepositoryCustom {
11+
List<User> findUserByEmails(Set<String> emails);
12+
13+
List<User> findAllUsersByPredicates(Collection<Predicate<User>> predicates);
14+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package org.baeldung.spring.data.persistence.dao.user;
2+
3+
import java.util.ArrayList;
4+
import java.util.Collection;
5+
import java.util.List;
6+
import java.util.Set;
7+
import java.util.stream.Collectors;
8+
import java.util.stream.Stream;
9+
10+
import javax.persistence.EntityManager;
11+
import javax.persistence.PersistenceContext;
12+
import javax.persistence.criteria.CriteriaBuilder;
13+
import javax.persistence.criteria.CriteriaQuery;
14+
import javax.persistence.criteria.Path;
15+
import javax.persistence.criteria.Predicate;
16+
import javax.persistence.criteria.Root;
17+
18+
import org.baeldung.spring.data.persistence.model.User;
19+
20+
public class UserRepositoryCustomImpl implements UserRepositoryCustom {
21+
22+
@PersistenceContext
23+
private EntityManager entityManager;
24+
25+
@Override
26+
public List<User> findUserByEmails(Set<String> emails) {
27+
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
28+
CriteriaQuery<User> query = cb.createQuery(User.class);
29+
Root<User> user = query.from(User.class);
30+
31+
Path<String> emailPath = user.get("email");
32+
33+
List<Predicate> predicates = new ArrayList<>();
34+
for (String email : emails) {
35+
36+
predicates.add(cb.like(emailPath, email));
37+
38+
}
39+
query.select(user)
40+
.where(cb.or(predicates.toArray(new Predicate[predicates.size()])));
41+
42+
return entityManager.createQuery(query)
43+
.getResultList();
44+
}
45+
46+
@Override
47+
public List<User> findAllUsersByPredicates(Collection<java.util.function.Predicate<User>> predicates) {
48+
List<User> allUsers = entityManager.createQuery("select u from User u", User.class).getResultList();
49+
Stream<User> allUsersStream = allUsers.stream();
50+
for (java.util.function.Predicate<User> predicate : predicates) {
51+
allUsersStream = allUsersStream.filter(predicate);
52+
}
53+
54+
return allUsersStream.collect(Collectors.toList());
55+
}
56+
57+
}
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
package org.baeldung.spring.data.persistence.model;
2+
3+
import javax.persistence.Entity;
4+
import javax.persistence.GeneratedValue;
5+
import javax.persistence.GenerationType;
6+
import javax.persistence.Id;
7+
import javax.persistence.Table;
8+
9+
@Entity
10+
@Table
11+
public class Possession {
12+
13+
@Id
14+
@GeneratedValue(strategy = GenerationType.IDENTITY)
15+
private long id;
16+
17+
private String name;
18+
19+
public Possession() {
20+
super();
21+
}
22+
23+
public Possession(final String name) {
24+
super();
25+
26+
this.name = name;
27+
}
28+
29+
public long getId() {
30+
return id;
31+
}
32+
33+
public void setId(final int id) {
34+
this.id = id;
35+
}
36+
37+
public String getName() {
38+
return name;
39+
}
40+
41+
public void setName(final String name) {
42+
this.name = name;
43+
}
44+
45+
@Override
46+
public int hashCode() {
47+
final int prime = 31;
48+
int result = 1;
49+
result = (prime * result) + (int) (id ^ (id >>> 32));
50+
result = (prime * result) + ((name == null) ? 0 : name.hashCode());
51+
return result;
52+
}
53+
54+
@Override
55+
public boolean equals(Object obj) {
56+
if (this == obj) {
57+
return true;
58+
}
59+
if (obj == null) {
60+
return false;
61+
}
62+
if (getClass() != obj.getClass()) {
63+
return false;
64+
}
65+
final Possession other = (Possession) obj;
66+
if (id != other.id) {
67+
return false;
68+
}
69+
if (name == null) {
70+
if (other.name != null) {
71+
return false;
72+
}
73+
} else if (!name.equals(other.name)) {
74+
return false;
75+
}
76+
return true;
77+
}
78+
79+
@Override
80+
public String toString() {
81+
final StringBuilder builder = new StringBuilder();
82+
builder.append("Possesion [id=").append(id).append(", name=").append(name).append("]");
83+
return builder.toString();
84+
}
85+
86+
}

0 commit comments

Comments
 (0)