diff --git a/src/main/java/lab/App.java b/src/main/java/lab/App.java index be7b48deffae11f03fca3713dea9848fd64f0910..69dd04113ab528b5e7a747818cb697a2f7596d57 100644 --- a/src/main/java/lab/App.java +++ b/src/main/java/lab/App.java @@ -2,9 +2,14 @@ package lab; import java.io.IOException; import java.sql.SQLException; +import java.util.List; import org.h2.tools.Server; +import lab.data.Game; +import lab.data.Player; +import lab.data.Score; +import lab.data.Score.Difficult; import lab.storage.JpaConnector; import lombok.extern.log4j.Log4j2; @@ -23,12 +28,50 @@ public class App { Server server = startDBWebServer(); JpaConnector connector = new JpaConnector(); - - //TODO + for (int i = 0; i < 10; i++) { + connector.save(Game.generateAny()); + } + for (int i = 0; i < 10; i++) { + connector.save(Player.generate()); + } + List<Player> players = connector.getAll(Player.class); + List<Game> games = connector.getAll(Game.class); + for (int i = 0; i < 10; i++) { + connector.save(Score.generate(players, games)); + } + connector.getEntityManager().clear(); + connector.getAll(Score.class).forEach(System.out::println); + connector.getAll(Player.class).forEach(App::printPlayer); + connector.getAll(Game.class).forEach(App::printGame); + + System.out.println("-----------null,null-----------------------------"); + connector.findBy(null, null).forEach(System.out::println); + System.out.println("----------- ,null-----------------------------"); + connector.findBy(" ", null).forEach(System.out::println); + System.out.println("-----------'ea',null-----------------------------"); + connector.findBy("ea", null).forEach(System.out::println); + System.out.println("-----------'ea',medium-----------------------------"); + connector.findBy("ea", Difficult.MEDIUM).forEach(System.out::println); + System.out.println("-----------'Java',null-----------------------------"); + connector.findBy("Java", Difficult.MEDIUM).forEach(System.out::println); waitForKeyPress(); stopDBWebServer(server); } + + private static void printPlayer(Player player) { + System.out.println(player); + for (Score score : player.getScores()) { + System.out.println(" -> " + score); + } + } + + private static void printGame(Game game) { + System.out.println(game); + for (Score score : game.getScores()) { + System.out.println(" -> " + score); + } + } private static Server startDBWebServer() { // Start HTTP server for access H2 DB for look inside diff --git a/src/main/java/lab/data/FirstPersonShooter.java b/src/main/java/lab/data/FirstPersonShooter.java index a1602bd97fb36e4dbbb5d6aa87597a0c0a8d58b5..61b66e27f5b955a91ffabe3bd1c1b0ef1637ca32 100644 --- a/src/main/java/lab/data/FirstPersonShooter.java +++ b/src/main/java/lab/data/FirstPersonShooter.java @@ -2,13 +2,17 @@ package lab.data; import java.util.List; +import jakarta.persistence.Entity; import lab.Tools; import lombok.Getter; +import lombok.NoArgsConstructor; import lombok.Setter; import lombok.ToString; +@Entity @Getter @Setter +@NoArgsConstructor @ToString(callSuper = true) public class FirstPersonShooter extends Game { diff --git a/src/main/java/lab/data/Game.java b/src/main/java/lab/data/Game.java index 5035ff9f80bf751bfc37c502e852603edd9731d0..5c59cf54cec2258558b2ef25cdb615ad3ecec74d 100644 --- a/src/main/java/lab/data/Game.java +++ b/src/main/java/lab/data/Game.java @@ -2,20 +2,37 @@ package lab.data; import java.util.List; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.OneToMany; import lab.Tools; +import lombok.AllArgsConstructor; import lombok.Builder; +import lombok.EqualsAndHashCode; import lombok.Getter; +import lombok.NoArgsConstructor; import lombok.Setter; import lombok.ToString; +@Entity @Getter @Setter +@AllArgsConstructor +@NoArgsConstructor +@EqualsAndHashCode(onlyExplicitlyIncluded = true) @ToString @Builder(toBuilder = true) public class Game implements MyEntity { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @EqualsAndHashCode.Include private Long id; private String name; + @OneToMany(mappedBy = Score_.GAME) + @ToString.Exclude private List<Score> scores; public static Game generate() { diff --git a/src/main/java/lab/data/PlatformGame.java b/src/main/java/lab/data/PlatformGame.java index 3508998763bce1c84e9b7afe6802c35d418df6c4..7617387137c6cc836cf81399cfdcb5f0060bb887 100644 --- a/src/main/java/lab/data/PlatformGame.java +++ b/src/main/java/lab/data/PlatformGame.java @@ -2,13 +2,19 @@ package lab.data; import java.util.List; +import jakarta.persistence.Entity; import lab.Tools; +import lombok.AllArgsConstructor; import lombok.Getter; +import lombok.NoArgsConstructor; import lombok.Setter; import lombok.ToString; +@Entity @Getter @Setter +@AllArgsConstructor +@NoArgsConstructor @ToString(callSuper = true) public class PlatformGame extends Game { diff --git a/src/main/java/lab/data/Player.java b/src/main/java/lab/data/Player.java index 1c0bbd3b07eef69a66b3b9d29273ae082034af45..a7928d8fd49a1c09b062afb7c5d8264044fbfacf 100644 --- a/src/main/java/lab/data/Player.java +++ b/src/main/java/lab/data/Player.java @@ -2,22 +2,40 @@ package lab.data; import java.util.List; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.OneToMany; import lab.Tools; +import lombok.AllArgsConstructor; import lombok.Builder; +import lombok.EqualsAndHashCode; import lombok.Getter; +import lombok.NoArgsConstructor; import lombok.Setter; import lombok.ToString; +@Entity @Getter @Setter +@AllArgsConstructor +@NoArgsConstructor +@EqualsAndHashCode(onlyExplicitlyIncluded = true) @ToString @Builder(toBuilder = true) public class Player implements MyEntity { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @EqualsAndHashCode.Include private Long id; private String firstName; private String lastName; private String nick; + @OneToMany(mappedBy = Score_.PLAYER) + @ToString.Exclude private List<Score> scores; public static Player generate() { diff --git a/src/main/java/lab/data/Score.java b/src/main/java/lab/data/Score.java index 6fc69daf834577aae8a6ec72addb10af36bc6cba..efdcf22ecf0afffb08f5ab2f901373d11225539e 100644 --- a/src/main/java/lab/data/Score.java +++ b/src/main/java/lab/data/Score.java @@ -2,25 +2,42 @@ package lab.data; import java.util.List; +import jakarta.persistence.Entity; import jakarta.persistence.EnumType; import jakarta.persistence.Enumerated; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.ManyToOne; import lab.Tools; +import lombok.AllArgsConstructor; import lombok.Builder; +import lombok.EqualsAndHashCode; import lombok.Getter; +import lombok.NoArgsConstructor; import lombok.Setter; import lombok.ToString; +@Entity @Getter @Setter +@AllArgsConstructor +@NoArgsConstructor +@EqualsAndHashCode(onlyExplicitlyIncluded = true) @ToString @Builder(toBuilder = true) public class Score implements MyEntity { + @EqualsAndHashCode.Include + @Id + @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private int points; @Enumerated(EnumType.STRING) private Difficult difficult; + @ManyToOne private Player player; + @ManyToOne private Game game; public static Score generate(List<Player> players, List<Game> games) { diff --git a/src/main/java/lab/storage/JpaConnector.java b/src/main/java/lab/storage/JpaConnector.java index 86d139b6700506d38ce5e2060d2307301b2262bf..bf7b2ee245097b3e1e69e80bb590ccff756b5ed4 100644 --- a/src/main/java/lab/storage/JpaConnector.java +++ b/src/main/java/lab/storage/JpaConnector.java @@ -1,13 +1,20 @@ package lab.storage; +import java.util.ArrayList; import java.util.List; import java.util.function.Consumer; import jakarta.persistence.EntityManager; import jakarta.persistence.EntityManagerFactory; import jakarta.persistence.Persistence; +import jakarta.persistence.criteria.CriteriaBuilder; +import jakarta.persistence.criteria.CriteriaQuery; +import jakarta.persistence.criteria.Predicate; +import jakarta.persistence.criteria.Root; +import lab.data.Game_; import lab.data.MyEntity; import lab.data.Score; +import lab.data.Score_; public class JpaConnector { @@ -19,18 +26,29 @@ public class JpaConnector { em = emf.createEntityManager(); } - public<T extends MyEntity> List<T> getAll(Class<T> clazz) { - //TODO - return null; + public <T extends MyEntity> List<T> getAll(Class<T> clazz) { + return em.createQuery("select e from " + clazz.getSimpleName() + " e", clazz).getResultList(); } - public<T extends MyEntity> T save(T score) { - //TODO - return null; + public <T extends MyEntity> T save(T entity) { + T result; + em.getTransaction().begin(); + if (entity.getId() == null || entity.getId() == 0) { + em.persist(entity); + result = entity; + } else { + result = em.merge(entity); + } + em.getTransaction().commit(); + return result; } - public void delete(List<? extends MyEntity> e) { - //TODO + public void delete(List<? extends MyEntity> entities) { + em.getTransaction().begin(); + for (MyEntity entity : entities) { + em.remove(entity); + } + em.getTransaction().commit(); } public void stop() { @@ -42,21 +60,33 @@ public class JpaConnector { return em; } - public<T> T find(long id, Class<T> clazz) { + public <T> T find(long id, Class<T> clazz) { return em.find(clazz, id); } - - public void modifyNoPersistOrMerge(long id, Consumer<Score> motificator) { + + public void modifyNoPersistOrMerge(long id, Consumer<Score> modificator) { em.getTransaction().begin(); Score score = em.find(Score.class, id); - motificator.accept(score); + modificator.accept(score); em.getTransaction().commit(); } - - public List<Score> findBy(String partialName, Score.Difficult difficult){ - //TODO - return null; + public List<Score> findBy(String partialName, Score.Difficult difficult) { + CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder(); + CriteriaQuery<Score> criteriaQuery = criteriaBuilder.createQuery(Score.class); + Root<Score> root = criteriaQuery.from(Score.class); + List<Predicate> predicates = new ArrayList<>(); + if (partialName != null && !partialName.isBlank()) { + predicates.add( + criteriaBuilder.like(root.get(Score_.game).get(Game_.name), String.format("%%%s%%", partialName))); + } + if (difficult != null) { + predicates.add(criteriaBuilder.equal(root.get(Score_.difficult), difficult)); + } + if (!predicates.isEmpty()) { + criteriaQuery.where(predicates.toArray(new Predicate[predicates.size()])); + } + return em.createQuery(criteriaQuery).getResultList(); } - + } diff --git a/src/test/java/jez04/structure/test/ClassStructureTest.java b/src/test/java/jez04/structure/test/ClassStructureTest.java index cd88aadf97177a474e7057e4662e04d0769a0cf7..73feef090d12eeeadb8dae7c6d14d445a23037b3 100644 --- a/src/test/java/jez04/structure/test/ClassStructureTest.java +++ b/src/test/java/jez04/structure/test/ClassStructureTest.java @@ -12,7 +12,6 @@ import java.util.Objects; import org.hamcrest.Matchers; import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.MethodOrderer.OrderAnnotation;