Skip to content
Merged
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package org.baeldung.inmemory.persistence.dao;

import org.baeldung.inmemory.persistence.model.ManyStudent;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

public interface ManyStudentRepository extends JpaRepository<ManyStudent, Long> {
List<ManyStudent> findByManyTags_Name(String name);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package org.baeldung.inmemory.persistence.dao;

import org.baeldung.inmemory.persistence.model.ManyTag;
import org.springframework.data.jpa.repository.JpaRepository;

public interface ManyTagRepository extends JpaRepository<ManyTag, Long> {
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,10 @@ public interface StudentRepository extends JpaRepository<Student, Long> {
@Query("SELECT s FROM Student s JOIN s.tags t WHERE s.name = LOWER(:name) AND t = LOWER(:tag)")
List<Student> retrieveByNameFilterByTag(@Param("name") String name, @Param("tag") String tag);

@Query("SELECT s FROM Student s JOIN s.skillTags t WHERE t.name = LOWER(:tagName) AND t.value > :tagValue")
List<Student> retrieveByNameFilterByMinimumSkillTag(@Param("tagName") String tagName, @Param("tagValue") int tagValue);

@Query("SELECT s FROM Student s JOIN s.kvTags t WHERE t.key = LOWER(:key)")
List<Student> retrieveByKeyTag(@Param("key") String key);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package org.baeldung.inmemory.persistence.model;

import javax.persistence.Embeddable;

@Embeddable
public class KVTag {
private String key;
private String value;

public KVTag(){}

public KVTag(String key, String value) {
super();
this.key = key;
this.value = value;
}

public String getKey() {
return key;
}

public void setKey(String key) {
this.key = key;
}

public String getValue() {
return value;
}

public void setValue(String value) {
this.value = value;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package org.baeldung.inmemory.persistence.model;

import javax.persistence.Embeddable;

@Embeddable
public class LocationTag {
private String name;
private int xPos;
private int yPos;

public LocationTag(){}

public LocationTag(String name, int xPos, int yPos) {
super();
this.name = name;
this.xPos = xPos;
this.yPos = yPos;
}

public String getName() {
return name;
}

public int getxPos() {
return xPos;
}

public void setxPos(int xPos) {
this.xPos = xPos;
}

public int getyPos() {
return yPos;
}

public void setyPos(int yPos) {
this.yPos = yPos;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package org.baeldung.inmemory.persistence.model;

import javax.persistence.*;
import java.util.HashSet;
import java.util.Set;

@Entity
public class ManyStudent {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
private String name;

@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "manystudent_manytags",
joinColumns = @JoinColumn(name = "manystudent_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "manytag_id", referencedColumnName = "id"))
private Set<ManyTag> manyTags = new HashSet<>();

public ManyStudent() {}

public ManyStudent(String name) {
this.name = name;
}

public Set<ManyTag> getManyTags() {
return manyTags;
}

public void setManyTags(Set<ManyTag> manyTags) {
this.manyTags.addAll(manyTags);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package org.baeldung.inmemory.persistence.model;

import javax.persistence.*;
import java.util.HashSet;
import java.util.Set;

@Entity
public class ManyTag {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
private String name;

@ManyToMany(mappedBy = "manyTags")
private Set<ManyStudent> students = new HashSet<>();

public ManyTag() {}

public ManyTag(String name) {
this.name = name;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Set<ManyStudent> getStudents() {
return students;
}

public void setStudents(Set<ManyStudent> students) {
this.students.addAll(students);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package org.baeldung.inmemory.persistence.model;

import javax.persistence.Embeddable;

@Embeddable
public class SkillTag {
private String name;
private int value;

public SkillTag(){}

public SkillTag(String name, int value) {
super();
this.name = name;
this.value = value;
}

public int getValue() {
return value;
}

public void setValue(int value) {
this.value = value;
}

public String getName() {
return name;
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package org.baeldung.inmemory.persistence.model;

import java.util.ArrayList;
import java.util.List;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.Id;
import java.util.ArrayList;
import java.util.List;

@Entity
public class Student {
Expand All @@ -16,6 +16,12 @@ public class Student {
@ElementCollection
private List<String> tags = new ArrayList<>();

@ElementCollection
private List<SkillTag> skillTags = new ArrayList<>();

@ElementCollection
private List<KVTag> kvTags = new ArrayList<>();

public Student() {
}

Expand Down Expand Up @@ -48,4 +54,21 @@ public List<String> getTags() {
public void setTags(List<String> tags) {
this.tags.addAll(tags);
}

public List<SkillTag> getSkillTags() {
return skillTags;
}

public void setSkillTags(List<SkillTag> skillTags) {
this.skillTags.addAll(skillTags);
}

public List<KVTag> getKVTags() {
return this.kvTags;
}

public void setKVTags(List<KVTag> kvTags) {
this.kvTags.addAll(kvTags);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
package org.baeldung.persistence.repository;

import org.baeldung.config.StudentJpaConfig;
import org.baeldung.inmemory.persistence.dao.ManyStudentRepository;
import org.baeldung.inmemory.persistence.dao.ManyTagRepository;
import org.baeldung.inmemory.persistence.dao.StudentRepository;
import org.baeldung.inmemory.persistence.model.KVTag;
import org.baeldung.inmemory.persistence.model.ManyStudent;
import org.baeldung.inmemory.persistence.model.ManyTag;
import org.baeldung.inmemory.persistence.model.SkillTag;
import org.baeldung.inmemory.persistence.model.Student;
import org.junit.Test;
import org.junit.runner.RunWith;
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 javax.annotation.Resource;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import static org.junit.Assert.assertEquals;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { StudentJpaConfig.class }, loader = AnnotationConfigContextLoader.class)
@Transactional
public class AdvancedTaggingIntegrationTest {
@Resource
private StudentRepository studentRepository;

@Resource
private ManyStudentRepository manyStudentRepository;

@Resource
private ManyTagRepository manyTagRepository;

@Test
public void givenStudentWithSkillTags_whenSave_thenGetByNameAndSkillTag() {
Student student = new Student(1, "Will");
SkillTag skill1 = new SkillTag("java", 5);
student.setSkillTags(Arrays.asList(skill1));
studentRepository.save(student);

Student student2 = new Student(2, "Joe");
SkillTag skill2 = new SkillTag("java", 1);
student2.setSkillTags(Arrays.asList(skill2));
studentRepository.save(student2);

List<Student> students = studentRepository.retrieveByNameFilterByMinimumSkillTag("java", 3);
assertEquals("size incorrect", 1, students.size());
}

@Test
public void givenStudentWithKVTags_whenSave_thenGetByTagOk(){
Student student = new Student(0, "John");
student.setKVTags(Arrays.asList(new KVTag("department", "computer science")));
studentRepository.save(student);

Student student2 = new Student(1, "James");
student2.setKVTags(Arrays.asList(new KVTag("department", "humanities")));
studentRepository.save(student2);

List<Student> students = studentRepository.retrieveByKeyTag("department");
assertEquals("size incorrect", 2, students.size());
}

@Test
public void givenStudentWithManyTags_whenSave_theyGetByTagOk() {
ManyTag tag = new ManyTag("full time");
manyTagRepository.save(tag);

ManyStudent student = new ManyStudent("John");
student.setManyTags(Collections.singleton(tag));
manyStudentRepository.save(student);

List<ManyStudent> students = manyStudentRepository.findByManyTags_Name("full time");
assertEquals("size incorrect", 1, students.size());
}
}