-
Notifications
You must be signed in to change notification settings - Fork 167
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
2839a0b
commit 4dad6d5
Showing
53 changed files
with
1,363 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
.idea/ | ||
*.iml | ||
|
||
target/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
.idea/ | ||
*.iml | ||
|
||
target/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
<?xml version="1.0" encoding="UTF-8"?> | ||
<project xmlns="http://maven.apache.org/POM/4.0.0" | ||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||
<modelVersion>4.0.0</modelVersion> | ||
|
||
<groupId>ru.otus</groupId> | ||
<artifactId>demo</artifactId> | ||
<version>1.0-SNAPSHOT</version> | ||
|
||
<parent> | ||
<groupId>org.springframework.boot</groupId> | ||
<artifactId>spring-boot-starter-parent</artifactId> | ||
<version>3.1.3</version> | ||
<relativePath/> | ||
</parent> | ||
|
||
<properties> | ||
<maven.compiler.source>17</maven.compiler.source> | ||
<maven.compiler.target>17</maven.compiler.target> | ||
</properties> | ||
|
||
<dependencies> | ||
<dependency> | ||
<groupId>org.springframework.boot</groupId> | ||
<artifactId>spring-boot-starter</artifactId> | ||
</dependency> | ||
<dependency> | ||
<groupId>org.springframework.boot</groupId> | ||
<artifactId>spring-boot-starter-data-jpa</artifactId> | ||
</dependency> | ||
<dependency> | ||
<groupId>com.h2database</groupId> | ||
<artifactId>h2</artifactId> | ||
</dependency> | ||
<dependency> | ||
<groupId>org.springframework.boot</groupId> | ||
<artifactId>spring-boot-starter-test</artifactId> | ||
<scope>test</scope> | ||
</dependency> | ||
<dependency> | ||
<groupId>org.projectlombok</groupId> | ||
<artifactId>lombok</artifactId> | ||
<optional>true</optional> | ||
</dependency> | ||
</dependencies> | ||
|
||
<build> | ||
<plugins> | ||
<plugin> | ||
<groupId>org.springframework.boot</groupId> | ||
<artifactId>spring-boot-maven-plugin</artifactId> | ||
</plugin> | ||
</plugins> | ||
</build> | ||
</project> |
75 changes: 75 additions & 0 deletions
75
2023-09/spring-13-data-jpa/demo/src/main/java/ru/otus/springdata/Main.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,75 @@ | ||
package ru.otus.springdata; | ||
|
||
import org.springframework.boot.SpringApplication; | ||
import org.springframework.boot.autoconfigure.SpringBootApplication; | ||
import org.springframework.context.ConfigurableApplicationContext; | ||
import org.springframework.data.domain.Example; | ||
import org.springframework.data.domain.ExampleMatcher; | ||
import org.springframework.data.jpa.domain.Specification; | ||
import ru.otus.springdata.domain.Email; | ||
import ru.otus.springdata.domain.Person; | ||
import ru.otus.springdata.repository.EmailRepository; | ||
import ru.otus.springdata.repository.PersonRepository; | ||
|
||
import java.util.Objects; | ||
import java.util.stream.Collectors; | ||
|
||
import static ru.otus.springdata.repository.PersonSpecification.emailAddressLike; | ||
import static ru.otus.springdata.repository.PersonSpecification.nameLike; | ||
|
||
@SpringBootApplication | ||
public class Main { | ||
|
||
public static void main(String[] args) { | ||
ConfigurableApplicationContext context = SpringApplication.run(Main.class); | ||
|
||
PersonRepository personRepository = context.getBean(PersonRepository.class); | ||
EmailRepository emailRepository = context.getBean(EmailRepository.class); | ||
|
||
var pushkin = new Person("Александр Сергеевич Пушкин", new Email("[email protected]")); | ||
var block = new Person("Александр Александрович Блок", new Email("[email protected]")); | ||
var lermontov = new Person("Михаил Юрьевич Лермонтов", new Email("[email protected]")); | ||
var gorbachev = new Person("Михаил Сергеевич Горбачев", new Email("[email protected]")); | ||
var bulgakov = new Person("Михаил Афанасьевич Булгаков", new Email("[email protected]")); | ||
|
||
emailRepository.save(pushkin.getEmail()); | ||
emailRepository.save(block.getEmail()); | ||
emailRepository.save(lermontov.getEmail()); | ||
emailRepository.save(gorbachev.getEmail()); | ||
emailRepository.save(bulgakov.getEmail()); | ||
|
||
personRepository.save(pushkin); | ||
personRepository.save(block); | ||
personRepository.save(lermontov); | ||
personRepository.save(gorbachev); | ||
personRepository.save(bulgakov); | ||
|
||
System.out.println("\n\nИщем почту Горбачева по его id"); | ||
emailRepository.findByPersonId(gorbachev.getId()) | ||
.ifPresent(System.out::println); | ||
|
||
|
||
System.out.println("\n\nС помощью Example ищем всех пёрсонов с именем \"Михаил\" и почтой на \"mail.ru\""); | ||
ExampleMatcher ignoringExampleMatcher = ExampleMatcher.matchingAll() | ||
.withMatcher("email.address", ExampleMatcher.GenericPropertyMatchers.contains().ignoreCase()) | ||
.withMatcher("name", ExampleMatcher.GenericPropertyMatchers.contains().ignoreCase()) | ||
.withIgnorePaths("id", "email.id"); | ||
|
||
Example<Person> example = Example.of(new Person("Михаил", new Email(0, "mail.ru")), ignoringExampleMatcher); | ||
|
||
System.out.println(personRepository.findAll(example).stream().map(Objects::toString) | ||
.collect(Collectors.joining("\n"))); | ||
|
||
|
||
System.out.println("\n\nС помощью Specification ищем всех пёрсонов с именем \"Александр\" или с почтой на \"bk.ru\""); | ||
|
||
Specification<Person> specification = Specification.where(nameLike("Александр")) | ||
.or(emailAddressLike("bk.ru")); | ||
|
||
System.out.println(personRepository.findAll(specification).stream().map(Objects::toString) | ||
.collect(Collectors.joining("\n"))); | ||
|
||
System.out.println("\n\n"); | ||
|
||
} | ||
} |
26 changes: 26 additions & 0 deletions
26
2023-09/spring-13-data-jpa/demo/src/main/java/ru/otus/springdata/domain/Email.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
package ru.otus.springdata.domain; | ||
|
||
import jakarta.persistence.Entity; | ||
import jakarta.persistence.GeneratedValue; | ||
import jakarta.persistence.GenerationType; | ||
import jakarta.persistence.Id; | ||
import lombok.AllArgsConstructor; | ||
import lombok.Data; | ||
import lombok.NoArgsConstructor; | ||
|
||
@Data | ||
@NoArgsConstructor | ||
@AllArgsConstructor | ||
@Entity | ||
public class Email { | ||
|
||
@Id | ||
@GeneratedValue(strategy = GenerationType.IDENTITY) | ||
private long id; | ||
|
||
private String address; | ||
|
||
public Email(String address) { | ||
this.address = address; | ||
} | ||
} |
34 changes: 34 additions & 0 deletions
34
2023-09/spring-13-data-jpa/demo/src/main/java/ru/otus/springdata/domain/Person.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
package ru.otus.springdata.domain; | ||
|
||
import jakarta.persistence.Entity; | ||
import jakarta.persistence.GeneratedValue; | ||
import jakarta.persistence.GenerationType; | ||
import jakarta.persistence.Id; | ||
import jakarta.persistence.JoinColumn; | ||
import jakarta.persistence.OneToOne; | ||
import lombok.AllArgsConstructor; | ||
import lombok.Data; | ||
import lombok.NoArgsConstructor; | ||
|
||
@Data | ||
@NoArgsConstructor | ||
@AllArgsConstructor | ||
@Entity | ||
public class Person { | ||
|
||
@Id | ||
@GeneratedValue(strategy = GenerationType.IDENTITY) | ||
private long id; | ||
|
||
private String name; | ||
|
||
@OneToOne(orphanRemoval = true) | ||
@JoinColumn(name = "email_id") | ||
private Email email; | ||
|
||
public Person(String name, Email email) { | ||
this.name = name; | ||
this.email = email; | ||
} | ||
|
||
} |
21 changes: 21 additions & 0 deletions
21
.../spring-13-data-jpa/demo/src/main/java/ru/otus/springdata/repository/EmailRepository.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
package ru.otus.springdata.repository; | ||
|
||
import org.springframework.data.jpa.repository.JpaRepository; | ||
import org.springframework.data.jpa.repository.Modifying; | ||
import org.springframework.data.jpa.repository.Query; | ||
import org.springframework.data.repository.query.Param; | ||
import org.springframework.transaction.annotation.Transactional; | ||
import ru.otus.springdata.domain.Email; | ||
|
||
import java.util.Optional; | ||
|
||
public interface EmailRepository extends JpaRepository<Email, Long>, EmailRepositoryCustom { | ||
|
||
@Query("select e from Email e where e.address = :address") | ||
Optional<Email> findByEmailAddress(@Param("address") String email); | ||
|
||
@Modifying | ||
@Transactional | ||
@Query("update Email e set e.address = :address where e.id = :id") | ||
void updateEmailById(@Param("id") long id, @Param("address") String address); | ||
} |
9 changes: 9 additions & 0 deletions
9
...g-13-data-jpa/demo/src/main/java/ru/otus/springdata/repository/EmailRepositoryCustom.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
package ru.otus.springdata.repository; | ||
|
||
import ru.otus.springdata.domain.Email; | ||
|
||
import java.util.Optional; | ||
|
||
public interface EmailRepositoryCustom { | ||
Optional<Email> findByPersonId(long personId); | ||
} |
20 changes: 20 additions & 0 deletions
20
...-data-jpa/demo/src/main/java/ru/otus/springdata/repository/EmailRepositoryCustomImpl.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
package ru.otus.springdata.repository; | ||
|
||
import lombok.RequiredArgsConstructor; | ||
import org.springframework.stereotype.Repository; | ||
import ru.otus.springdata.domain.Email; | ||
import ru.otus.springdata.domain.Person; | ||
|
||
import java.util.Optional; | ||
|
||
@Repository | ||
@RequiredArgsConstructor | ||
public class EmailRepositoryCustomImpl implements EmailRepositoryCustom { | ||
|
||
private final PersonRepository personRepository; | ||
|
||
@Override | ||
public Optional<Email> findByPersonId(long personId) { | ||
return personRepository.findById(personId).map(Person::getEmail); | ||
} | ||
} |
20 changes: 20 additions & 0 deletions
20
...spring-13-data-jpa/demo/src/main/java/ru/otus/springdata/repository/PersonRepository.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
package ru.otus.springdata.repository; | ||
|
||
import org.springframework.data.jpa.repository.EntityGraph; | ||
import org.springframework.data.jpa.repository.JpaRepository; | ||
import org.springframework.data.jpa.repository.JpaSpecificationExecutor; | ||
import org.springframework.data.repository.CrudRepository; | ||
import ru.otus.springdata.domain.Person; | ||
|
||
import java.util.List; | ||
import java.util.Optional; | ||
|
||
public interface PersonRepository extends JpaRepository<Person, Long>, JpaSpecificationExecutor<Person> { | ||
|
||
@EntityGraph(attributePaths = "email") | ||
List<Person> findAll(); | ||
|
||
Optional<Person> findByName(String s); | ||
|
||
Optional<Person> findByEmailAddress(String email); | ||
} |
21 changes: 21 additions & 0 deletions
21
...ing-13-data-jpa/demo/src/main/java/ru/otus/springdata/repository/PersonSpecification.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
package ru.otus.springdata.repository; | ||
|
||
import org.springframework.data.jpa.domain.Specification; | ||
import ru.otus.springdata.domain.Person; | ||
|
||
public class PersonSpecification { | ||
|
||
public static Specification<Person> nameLike(String name) { | ||
if (name == null) { | ||
return null; | ||
} | ||
return (root, query, cb) -> cb.like(root.get("name"), "%" + name + "%"); | ||
} | ||
|
||
public static Specification<Person> emailAddressLike(String address) { | ||
if (address == null) { | ||
return null; | ||
} | ||
return (root, query, cb) -> cb.like(root.join("email").get("address"), "%" + address + "%"); | ||
} | ||
} |
20 changes: 20 additions & 0 deletions
20
2023-09/spring-13-data-jpa/demo/src/main/resources/application.yml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
spring: | ||
datasource: | ||
url: jdbc:h2:mem:testdb | ||
initialization-mode: never | ||
|
||
jpa: | ||
generate-ddl: true | ||
hibernate: | ||
ddl-auto: create | ||
|
||
properties: | ||
hibernate: | ||
format_sql: false | ||
|
||
show-sql: true | ||
|
||
|
||
logging: | ||
level: | ||
ROOT: ERROR |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
.idea/ | ||
*.iml | ||
|
||
target/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
<?xml version="1.0" encoding="UTF-8"?> | ||
<project xmlns="http://maven.apache.org/POM/4.0.0" | ||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||
<modelVersion>4.0.0</modelVersion> | ||
|
||
<groupId>ru.otus</groupId> | ||
<artifactId>exercise</artifactId> | ||
<version>1.0-SNAPSHOT</version> | ||
|
||
<parent> | ||
<groupId>org.springframework.boot</groupId> | ||
<artifactId>spring-boot-starter-parent</artifactId> | ||
<version>3.1.3</version> | ||
<relativePath/> | ||
</parent> | ||
|
||
<properties> | ||
<maven.compiler.source>17</maven.compiler.source> | ||
<maven.compiler.target>17</maven.compiler.target> | ||
</properties> | ||
|
||
<dependencies> | ||
<dependency> | ||
<groupId>org.springframework.boot</groupId> | ||
<artifactId>spring-boot-starter</artifactId> | ||
</dependency> | ||
<dependency> | ||
<groupId>org.springframework.boot</groupId> | ||
<artifactId>spring-boot-starter-data-jpa</artifactId> | ||
</dependency> | ||
<dependency> | ||
<groupId>com.h2database</groupId> | ||
<artifactId>h2</artifactId> | ||
</dependency> | ||
<dependency> | ||
<groupId>org.projectlombok</groupId> | ||
<artifactId>lombok</artifactId> | ||
<optional>true</optional> | ||
</dependency> | ||
</dependencies> | ||
|
||
<build> | ||
<plugins> | ||
<plugin> | ||
<groupId>org.springframework.boot</groupId> | ||
<artifactId>spring-boot-maven-plugin</artifactId> | ||
</plugin> | ||
</plugins> | ||
</build> | ||
</project> |
Oops, something went wrong.