diff --git a/persistence-modules/spring-jpa/pom.xml b/persistence-modules/spring-jpa/pom.xml
index 04c64fafc3..bc0b2381f3 100644
--- a/persistence-modules/spring-jpa/pom.xml
+++ b/persistence-modules/spring-jpa/pom.xml
@@ -13,7 +13,7 @@
com.baeldung
parent-modules
1.0.0-SNAPSHOT
- ../
+ ../../
diff --git a/persistence-modules/spring-jpa/src/main/java/org/baeldung/inmemory/persistence/dao/StudentRepository.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/inmemory/persistence/dao/StudentRepository.java
index bfcf6f5cdc..f856b78c52 100644
--- a/persistence-modules/spring-jpa/src/main/java/org/baeldung/inmemory/persistence/dao/StudentRepository.java
+++ b/persistence-modules/spring-jpa/src/main/java/org/baeldung/inmemory/persistence/dao/StudentRepository.java
@@ -2,6 +2,17 @@ package org.baeldung.inmemory.persistence.dao;
import org.baeldung.inmemory.persistence.model.Student;
import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+
+import java.util.List;
public interface StudentRepository extends JpaRepository {
+
+ @Query("SELECT s FROM Student s JOIN s.tags t WHERE t = LOWER(:tag)")
+ List retrieveByTag(@Param("tag") String tag);
+
+ @Query("SELECT s FROM Student s JOIN s.tags t WHERE s.name = LOWER(:name) AND t = LOWER(:tag)")
+ List retrieveByNameFilterByTag(@Param("name") String name, @Param("tag") String tag);
+
}
diff --git a/persistence-modules/spring-jpa/src/main/java/org/baeldung/inmemory/persistence/model/Student.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/inmemory/persistence/model/Student.java
index b50fe9122e..2e4e3ea2cb 100644
--- a/persistence-modules/spring-jpa/src/main/java/org/baeldung/inmemory/persistence/model/Student.java
+++ b/persistence-modules/spring-jpa/src/main/java/org/baeldung/inmemory/persistence/model/Student.java
@@ -1,7 +1,10 @@
package org.baeldung.inmemory.persistence.model;
+import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.Id;
+import java.util.ArrayList;
+import java.util.List;
@Entity
public class Student {
@@ -10,6 +13,9 @@ public class Student {
private long id;
private String name;
+ @ElementCollection
+ private List tags = new ArrayList<>();
+
public Student() {
}
@@ -35,4 +41,11 @@ public class Student {
this.name = name;
}
+ public List getTags() {
+ return tags;
+ }
+
+ public void setTags(List tags) {
+ this.tags.addAll(tags);
+ }
}
diff --git a/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/repository/InMemoryDBIntegrationTest.java b/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/repository/InMemoryDBIntegrationTest.java
index 8380ab5434..28d7e3772c 100644
--- a/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/repository/InMemoryDBIntegrationTest.java
+++ b/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/repository/InMemoryDBIntegrationTest.java
@@ -12,6 +12,9 @@ import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
+import java.util.Arrays;
+import java.util.List;
+
import static org.junit.Assert.assertEquals;
@RunWith(SpringJUnit4ClassRunner.class)
@@ -34,4 +37,46 @@ public class InMemoryDBIntegrationTest {
assertEquals("name incorrect", NAME, student2.getName());
}
+ @Test
+ public void givenStudentWithTags_whenSave_thenGetByTagOk(){
+ Student student = new Student(ID, NAME);
+ student.setTags(Arrays.asList("full time", "computer science"));
+ studentRepository.save(student);
+
+ Student student2 = studentRepository.retrieveByTag("full time").get(0);
+ assertEquals("name incorrect", NAME, student2.getName());
+ }
+
+ @Test
+ public void givenMultipleStudentsWithTags_whenSave_thenGetByTagReturnsCorrectCount(){
+ Student student = new Student(0, "Larry");
+ student.setTags(Arrays.asList("full time", "computer science"));
+ studentRepository.save(student);
+
+ Student student2 = new Student(1, "Curly");
+ student2.setTags(Arrays.asList("part time", "rocket science"));
+ studentRepository.save(student2);
+
+ Student student3 = new Student(2, "Moe");
+ student3.setTags(Arrays.asList("full time", "philosophy"));
+ studentRepository.save(student3);
+
+ Student student4 = new Student(3, "Shemp");
+ student4.setTags(Arrays.asList("part time", "mathematics"));
+ studentRepository.save(student4);
+
+ List students = studentRepository.retrieveByTag("full time");
+ assertEquals("size incorrect", 2, students.size());
+ }
+
+ @Test
+ public void givenStudentWithTags_whenSave_thenGetByNameAndTagOk(){
+ Student student = new Student(ID, NAME);
+ student.setTags(Arrays.asList("full time", "computer science"));
+ studentRepository.save(student);
+
+ Student student2 = studentRepository.retrieveByNameFilterByTag("John", "full time").get(0);
+ assertEquals("name incorrect", NAME, student2.getName());
+ }
+
}