Merge branch 'eugenp:master' into master
This commit is contained in:
commit
020914dbf9
@ -13,4 +13,22 @@
|
|||||||
<version>1.0.0-SNAPSHOT</version>
|
<version>1.0.0-SNAPSHOT</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<jmh.version>1.35</jmh.version>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.openjdk.jmh</groupId>
|
||||||
|
<artifactId>jmh-core</artifactId>
|
||||||
|
<version>${jmh.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.openjdk.jmh</groupId>
|
||||||
|
<artifactId>jmh-generator-annprocess</artifactId>
|
||||||
|
<version>${jmh.version}</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
</project>
|
</project>
|
@ -0,0 +1,50 @@
|
|||||||
|
package com.baeldung.algorithms.perfectnumber;
|
||||||
|
|
||||||
|
import java.util.stream.IntStream;
|
||||||
|
|
||||||
|
class PerfectNumber {
|
||||||
|
|
||||||
|
public static boolean isPerfectBruteForce(int number) {
|
||||||
|
int sum = 0;
|
||||||
|
for (int i = 1; i <= number / 2; i++) {
|
||||||
|
if (number % i == 0) {
|
||||||
|
sum += i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sum == number;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isPerfectStream(int number) {
|
||||||
|
int sum = IntStream.rangeClosed(2, (int) Math.sqrt(number))
|
||||||
|
.filter(test -> number % test == 0)
|
||||||
|
.reduce(1, (s, test) -> s + test + (number / test));
|
||||||
|
return sum == number;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isPerfectEuclidEuler(int number) {
|
||||||
|
int p = 2;
|
||||||
|
int perfectNumber = (int) (Math.pow(2, p - 1) * (Math.pow(2, p) - 1));
|
||||||
|
while (perfectNumber <= number) {
|
||||||
|
if (perfectNumber == number) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
p++;
|
||||||
|
perfectNumber = (int) (Math.pow(2, p - 1) * (Math.pow(2, p) - 1));
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isPerfectEuclidEulerUsingShift(int number) {
|
||||||
|
int p = 2;
|
||||||
|
int perfectNumber = (2 << (p - 1)) * ((2 << p) - 1);
|
||||||
|
while (perfectNumber <= number) {
|
||||||
|
if (perfectNumber == number) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
p++;
|
||||||
|
perfectNumber = (2 << (p - 1)) * ((2 << p) - 1);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,41 @@
|
|||||||
|
package com.baeldung.algorithms.perfectnumber;
|
||||||
|
|
||||||
|
import org.openjdk.jmh.annotations.Benchmark;
|
||||||
|
import org.openjdk.jmh.annotations.Scope;
|
||||||
|
import org.openjdk.jmh.annotations.State;
|
||||||
|
import org.openjdk.jmh.runner.Runner;
|
||||||
|
import org.openjdk.jmh.runner.options.Options;
|
||||||
|
import org.openjdk.jmh.runner.options.OptionsBuilder;
|
||||||
|
|
||||||
|
@State(Scope.Benchmark)
|
||||||
|
public class PerfectNumberBenchmark {
|
||||||
|
|
||||||
|
@Benchmark
|
||||||
|
public boolean bruteForceBenchmark() {
|
||||||
|
return PerfectNumber.isPerfectBruteForce(33550336);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Benchmark
|
||||||
|
public boolean streamBenchmark() {
|
||||||
|
return PerfectNumber.isPerfectStream(33550336);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Benchmark
|
||||||
|
public boolean euclidEulerBenchmark() {
|
||||||
|
return PerfectNumber.isPerfectEuclidEuler(33550336);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Benchmark
|
||||||
|
public boolean euclidEulerUsingShiftBenchmark() {
|
||||||
|
return PerfectNumber.isPerfectEuclidEulerUsingShift(33550336);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) throws Exception {
|
||||||
|
Options options = new OptionsBuilder()
|
||||||
|
.include(PerfectNumberBenchmark.class.getSimpleName())
|
||||||
|
.forks(1)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
new Runner(options).run();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,68 @@
|
|||||||
|
package com.baeldung.algorithms.perfectnumber;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
|
||||||
|
class PerfectNumberUnitTest {
|
||||||
|
@Test
|
||||||
|
void givenPerfectNumber_whenCheckingIsPerfectBruteForce_thenReturnTrue() {
|
||||||
|
assertTrue(PerfectNumber.isPerfectBruteForce(6));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenNonPerfectNumber_whenCheckingIsPerfectBruteForce_thenReturnFalse() {
|
||||||
|
assertFalse(PerfectNumber.isPerfectBruteForce(10));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenNegativeNumber_whenCheckingIsPerfectBruteForce_thenReturnFalse() {
|
||||||
|
assertFalse(PerfectNumber.isPerfectBruteForce(-28));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenPerfectNumber_whenCheckingIsPerfectStream_thenReturnTrue() {
|
||||||
|
assertTrue(PerfectNumber.isPerfectStream(28));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenNonPerfectNumber_whenCheckingIsPerfectStream_thenReturnFalse() {
|
||||||
|
assertFalse(PerfectNumber.isPerfectStream(10));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenNegativeNumber_whenCheckingIsPerfectStream_thenReturnFalse() {
|
||||||
|
assertFalse(PerfectNumber.isPerfectStream(-6));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenPerfectNumber_whenCheckingIsPerfectEuclidEuler_thenReturnTrue() {
|
||||||
|
assertTrue(PerfectNumber.isPerfectEuclidEuler(28));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenNonPerfectNumber_whenCheckingIsPerfectEuclidEuler_thenReturnFalse() {
|
||||||
|
assertFalse(PerfectNumber.isPerfectEuclidEuler(10));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenNegativeNumber_whenCheckingIsPerfectEuclidEuler_thenReturnFalse() {
|
||||||
|
assertFalse(PerfectNumber.isPerfectEuclidEuler(-6));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenPerfectNumber_whenCheckingIsPerfectEuclidEulerUsingShift_thenReturnTrue() {
|
||||||
|
assertTrue(PerfectNumber.isPerfectEuclidEulerUsingShift(28));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenNonPerfectNumber_whenCheckingIsPerfectEuclidEulerUsingShift_thenReturnFalse() {
|
||||||
|
assertFalse(PerfectNumber.isPerfectEuclidEulerUsingShift(10));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenNegativeNumber_whenCheckingIsPerfectEuclidEulerUsingShift_thenReturnFalse() {
|
||||||
|
assertFalse(PerfectNumber.isPerfectEuclidEulerUsingShift(-6));
|
||||||
|
}
|
||||||
|
}
|
@ -9,7 +9,6 @@
|
|||||||
- [Skipping the First Iteration in Java](https://www.baeldung.com/java-skip-first-iteration)
|
- [Skipping the First Iteration in Java](https://www.baeldung.com/java-skip-first-iteration)
|
||||||
- [Remove Elements From a Queue Using Loop](https://www.baeldung.com/java-remove-elements-queue)
|
- [Remove Elements From a Queue Using Loop](https://www.baeldung.com/java-remove-elements-queue)
|
||||||
- [Intro to Vector Class in Java](https://www.baeldung.com/java-vector-guide)
|
- [Intro to Vector Class in Java](https://www.baeldung.com/java-vector-guide)
|
||||||
- [HashSet toArray() Method in Java](https://www.baeldung.com/java-hashset-toarray)
|
|
||||||
- [Time Complexity of Java Collections Sort in Java](https://www.baeldung.com/java-time-complexity-collections-sort)
|
- [Time Complexity of Java Collections Sort in Java](https://www.baeldung.com/java-time-complexity-collections-sort)
|
||||||
- [Check if List Contains at Least One Enum](https://www.baeldung.com/java-list-check-enum-presence)
|
- [Check if List Contains at Least One Enum](https://www.baeldung.com/java-list-check-enum-presence)
|
||||||
- [Comparison of for Loops and Iterators](https://www.baeldung.com/java-for-loops-vs-iterators)
|
- [Comparison of for Loops and Iterators](https://www.baeldung.com/java-for-loops-vs-iterators)
|
||||||
|
@ -55,8 +55,8 @@
|
|||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-compiler-plugin</artifactId>
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
<configuration>
|
<configuration>
|
||||||
<source>9</source>
|
<source>16</source>
|
||||||
<target>9</target>
|
<target>16</target>
|
||||||
</configuration>
|
</configuration>
|
||||||
</plugin>
|
</plugin>
|
||||||
</plugins>
|
</plugins>
|
||||||
|
5
core-java-modules/core-java-collections-6/README.md
Normal file
5
core-java-modules/core-java-collections-6/README.md
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
=========
|
||||||
|
|
||||||
|
## Core Java Collections Cookbooks and Examples
|
||||||
|
|
||||||
|
### Relevant Articles:
|
71
core-java-modules/core-java-collections-6/pom.xml
Normal file
71
core-java-modules/core-java-collections-6/pom.xml
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
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>
|
||||||
|
<artifactId>core-java-collections-6</artifactId>
|
||||||
|
<packaging>jar</packaging>
|
||||||
|
<name>core-java-collections-6</name>
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<groupId>com.baeldung.core-java-modules</groupId>
|
||||||
|
<artifactId>core-java-modules</artifactId>
|
||||||
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.junit.platform</groupId>
|
||||||
|
<artifactId>junit-platform-runner</artifactId>
|
||||||
|
<version>${junit-platform.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.junit.jupiter</groupId>
|
||||||
|
<artifactId>junit-jupiter</artifactId>
|
||||||
|
<version>${junit.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.junit.vintage</groupId>
|
||||||
|
<artifactId>junit-vintage-engine</artifactId>
|
||||||
|
<version>${junit.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.roaringbitmap</groupId>
|
||||||
|
<artifactId>RoaringBitmap</artifactId>
|
||||||
|
<version>${roaringbitmap.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.openjdk.jmh</groupId>
|
||||||
|
<artifactId>jmh-generator-annprocess</artifactId>
|
||||||
|
<version>${jmh.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.openjdk.jmh</groupId>
|
||||||
|
<artifactId>jmh-core</artifactId>
|
||||||
|
<version>${jmh.version}</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<source>9</source>
|
||||||
|
<target>9</target>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<junit.version>5.9.2</junit.version>
|
||||||
|
<roaringbitmap.version>0.9.38</roaringbitmap.version>
|
||||||
|
<jmh.version>1.36</jmh.version>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
</project>
|
@ -0,0 +1,71 @@
|
|||||||
|
package com.baeldung.listiteration;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertIterableEquals;
|
||||||
|
|
||||||
|
public class ListIterationUnitTest {
|
||||||
|
|
||||||
|
List<String> programmingLanguages = new ArrayList<>(List.of("Java", "Python", "C++"));
|
||||||
|
List<Integer> numbers = new ArrayList<>(List.of(1, 2, 3));
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenStringList_whenAddElementWithListIterator_thenModifiedList() {
|
||||||
|
ListIterator<String> listIterator = programmingLanguages.listIterator();
|
||||||
|
while (listIterator.hasNext()) {
|
||||||
|
String language = listIterator.next();
|
||||||
|
if (language.equals("Python")) {
|
||||||
|
listIterator.add("JavaScript");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
assertIterableEquals(Arrays.asList("Java", "Python", "JavaScript", "C++"), programmingLanguages);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenNumericalList_whenMultiplyElementWithListIterator_thenModifiedList() {
|
||||||
|
ListIterator<Integer> listIterator = numbers.listIterator();
|
||||||
|
while (listIterator.hasNext()) {
|
||||||
|
int num = listIterator.next();
|
||||||
|
if (num == 2) {
|
||||||
|
listIterator.add(num * 10);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
assertIterableEquals(Arrays.asList(1, 2, 20, 3), numbers);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenStringList_whenAddElementWithEnhancedForLoopAndCopy_thenModifiedList() {
|
||||||
|
List<String> copyOfWords = new ArrayList<>(programmingLanguages);
|
||||||
|
for (String word : copyOfWords) {
|
||||||
|
programmingLanguages.add(word.toUpperCase()); // Modified: Convert to uppercase
|
||||||
|
}
|
||||||
|
assertIterableEquals(Arrays.asList("Java", "Python", "C++", "JAVA", "PYTHON", "C++"), programmingLanguages);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenNumericalList_whenMultiplyElementWithEnhancedForLoopAndCopy_thenModifiedList() {
|
||||||
|
List<Integer> copyOfNumbers = new ArrayList<>(numbers);
|
||||||
|
for (int num : copyOfNumbers) {
|
||||||
|
numbers.add(num * 2);
|
||||||
|
}
|
||||||
|
assertIterableEquals(Arrays.asList(1, 2, 3, 2, 4, 6), numbers);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenStringList_whenConvertToUpperCaseWithJava8Stream_thenModifiedList() {
|
||||||
|
programmingLanguages = programmingLanguages.stream().map(String::toUpperCase).collect(Collectors.toList());
|
||||||
|
assertIterableEquals(Arrays.asList("JAVA", "PYTHON", "C++"), programmingLanguages);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenNumericalList_whenMultiplyByThreeWithJava8Stream_thenModifiedList() {
|
||||||
|
numbers = numbers.stream().map(num -> num * 3).collect(Collectors.toList());
|
||||||
|
assertIterableEquals(Arrays.asList(3, 6, 9), numbers);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -5,3 +5,4 @@ This module contains articles about conversions among Collection types in Java.
|
|||||||
### Relevant Articles:
|
### Relevant Articles:
|
||||||
- [Converting HashMap Values to an ArrayList in Java](https://www.baeldung.com/java-hashmap-arraylist)
|
- [Converting HashMap Values to an ArrayList in Java](https://www.baeldung.com/java-hashmap-arraylist)
|
||||||
- [Joining a List<String> in Java With Commas and “and”](https://www.baeldung.com/java-string-concatenation-natural-language)
|
- [Joining a List<String> in Java With Commas and “and”](https://www.baeldung.com/java-string-concatenation-natural-language)
|
||||||
|
- [HashSet toArray() Method in Java](https://www.baeldung.com/java-hashset-toarray)
|
||||||
|
@ -1,59 +0,0 @@
|
|||||||
package com.baeldung.java.listInitialization;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
import java.util.stream.Stream;
|
|
||||||
|
|
||||||
import lombok.extern.java.Log;
|
|
||||||
|
|
||||||
import org.junit.Assert;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
@Log
|
|
||||||
public class ListInitializationUnitTest {
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void givenAnonymousInnerClass_thenInitialiseList() {
|
|
||||||
List<String> cities = new ArrayList() {
|
|
||||||
{
|
|
||||||
add("New York");
|
|
||||||
add("Rio");
|
|
||||||
add("Tokyo");
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Assert.assertTrue(cities.contains("New York"));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void givenArraysAsList_thenInitialiseList() {
|
|
||||||
List<String> list = Arrays.asList("foo", "bar");
|
|
||||||
|
|
||||||
Assert.assertTrue(list.contains("foo"));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test(expected = UnsupportedOperationException.class)
|
|
||||||
public void givenArraysAsList_whenAdd_thenUnsupportedException() {
|
|
||||||
List<String> list = Arrays.asList("foo", "bar");
|
|
||||||
|
|
||||||
list.add("baz");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void givenArraysAsList_whenCreated_thenShareReference() {
|
|
||||||
String[] array = { "foo", "bar" };
|
|
||||||
List<String> list = Arrays.asList(array);
|
|
||||||
array[0] = "baz";
|
|
||||||
Assert.assertEquals("baz", list.get(0));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void givenStream_thenInitializeList() {
|
|
||||||
List<String> list = Stream.of("foo", "bar")
|
|
||||||
.collect(Collectors.toList());
|
|
||||||
|
|
||||||
Assert.assertTrue(list.contains("foo"));
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,91 @@
|
|||||||
|
package com.baeldung.java.listinitialization;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import lombok.extern.java.Log;
|
||||||
|
|
||||||
|
@Log
|
||||||
|
public class ListInitializationUnitTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenAnonymousInnerClass_thenInitialiseList() {
|
||||||
|
List<String> cities = new ArrayList() {
|
||||||
|
{
|
||||||
|
add("New York");
|
||||||
|
add("Rio");
|
||||||
|
add("Tokyo");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
assertTrue(cities.contains("New York"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenArraysAsList_thenInitialiseList() {
|
||||||
|
List<String> list = Arrays.asList("foo", "bar");
|
||||||
|
|
||||||
|
assertTrue(list.contains("foo"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = UnsupportedOperationException.class)
|
||||||
|
public void givenArraysAsList_whenAdd_thenUnsupportedException() {
|
||||||
|
List<String> list = Arrays.asList("foo", "bar");
|
||||||
|
|
||||||
|
list.add("baz");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenArraysAsList_whenUsingArrayListConstructor_thenWeCanAddOrRemove() {
|
||||||
|
List<String> list = new ArrayList<>(Arrays.asList("foo", "bar"));
|
||||||
|
|
||||||
|
list.add("baz");
|
||||||
|
assertEquals(List.of("foo", "bar","baz"), list);
|
||||||
|
|
||||||
|
list.remove("baz");
|
||||||
|
assertEquals(List.of("foo", "bar"), list);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenArraysAsList_whenCreated_thenShareReference() {
|
||||||
|
String[] array = { "foo", "bar" };
|
||||||
|
List<String> list = Arrays.asList(array);
|
||||||
|
array[0] = "baz";
|
||||||
|
assertEquals("baz", list.get(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenIntNumbers_whenRequiredLong_thenCastAutomatically() {
|
||||||
|
int intNum = 42;
|
||||||
|
long longNum = intNum;
|
||||||
|
|
||||||
|
assertEquals(42L, longNum);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenArrayAsList_whenRequiredLongList_thenGetExpectedResult() {
|
||||||
|
List<Long> listOfLongFixedSize = Arrays.asList(1L, 2L, 3L);
|
||||||
|
List<Long> listOfLong = new ArrayList<>(Arrays.asList(1L, 2L, 3L));
|
||||||
|
|
||||||
|
List<Long> expected = List.of(1L, 2L, 3L);
|
||||||
|
|
||||||
|
assertEquals(expected, listOfLongFixedSize);
|
||||||
|
assertEquals(expected, listOfLong);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenStream_thenInitializeList() {
|
||||||
|
List<String> list = Stream.of("foo", "bar")
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
|
assertTrue(list.contains("foo"));
|
||||||
|
}
|
||||||
|
}
|
@ -86,7 +86,7 @@
|
|||||||
<maven.compiler.target>1.8</maven.compiler.target>
|
<maven.compiler.target>1.8</maven.compiler.target>
|
||||||
<jcabi-aspects.version>0.22.6</jcabi-aspects.version>
|
<jcabi-aspects.version>0.22.6</jcabi-aspects.version>
|
||||||
<aspectjrt.version>1.9.20.1</aspectjrt.version>
|
<aspectjrt.version>1.9.20.1</aspectjrt.version>
|
||||||
<cactoos.version>0.43</cactoos.version>
|
<cactoos.version>0.55.0</cactoos.version>
|
||||||
<ea-async.version>1.2.3</ea-async.version>
|
<ea-async.version>1.2.3</ea-async.version>
|
||||||
<jcabi-maven-plugin.version>0.14.1</jcabi-maven-plugin.version>
|
<jcabi-maven-plugin.version>0.14.1</jcabi-maven-plugin.version>
|
||||||
<aspectjtools.version>1.9.20.1</aspectjtools.version>
|
<aspectjtools.version>1.9.20.1</aspectjtools.version>
|
||||||
|
@ -7,15 +7,11 @@
|
|||||||
- [Evaluating a Math Expression in Java](https://www.baeldung.com/java-evaluate-math-expression-string)
|
- [Evaluating a Math Expression in Java](https://www.baeldung.com/java-evaluate-math-expression-string)
|
||||||
- [Swap Two Variables in Java](https://www.baeldung.com/java-swap-two-variables)
|
- [Swap Two Variables in Java](https://www.baeldung.com/java-swap-two-variables)
|
||||||
- [Java Program to Find the Roots of a Quadratic Equation](https://www.baeldung.com/roots-quadratic-equation)
|
- [Java Program to Find the Roots of a Quadratic Equation](https://www.baeldung.com/roots-quadratic-equation)
|
||||||
- [Create a BMI Calculator in Java](https://www.baeldung.com/java-body-mass-index-calculator)
|
|
||||||
- [Java Program to Calculate the Standard Deviation](https://www.baeldung.com/java-calculate-standard-deviation)
|
- [Java Program to Calculate the Standard Deviation](https://www.baeldung.com/java-calculate-standard-deviation)
|
||||||
- [Java Program to Print Pascal’s Triangle](https://www.baeldung.com/java-pascal-triangle)
|
- [Java Program to Print Pascal’s Triangle](https://www.baeldung.com/java-pascal-triangle)
|
||||||
- [Java Money and the Currency API](http://www.baeldung.com/java-money-and-currency)
|
- [Java Money and the Currency API](http://www.baeldung.com/java-money-and-currency)
|
||||||
- [Clamp Function in Java](https://www.baeldung.com/java-clamp-function)
|
- [Clamp Function in Java](https://www.baeldung.com/java-clamp-function)
|
||||||
- [Creating a Magic Square in Java](https://www.baeldung.com/java-magic-square)
|
- [Creating a Magic Square in Java](https://www.baeldung.com/java-magic-square)
|
||||||
- [Check if a Point Is Between Two Points Drawn on a Straight Line in Java](https://www.baeldung.com/java-check-point-straight-line)
|
|
||||||
- [Validate if a String Is a Valid Geo Coordinate](https://www.baeldung.com/java-geo-coordinates-validation)
|
- [Validate if a String Is a Valid Geo Coordinate](https://www.baeldung.com/java-geo-coordinates-validation)
|
||||||
- [Rotate a Vertex Around a Certain Point in Java](https://www.baeldung.com/java-rotate-vertex-around-point)
|
|
||||||
- [Calculating the Power of Any Number in Java Without Using Math pow() Method](https://www.baeldung.com/java-calculating-the-power-without-math-pow)
|
- [Calculating the Power of Any Number in Java Without Using Math pow() Method](https://www.baeldung.com/java-calculating-the-power-without-math-pow)
|
||||||
- [Solving Rod Cutting Problem in Java](https://www.baeldung.com/java-rod-cutting-problem)
|
|
||||||
- More articles: [[<-- Prev]](/core-java-modules/core-java-lang-math-2)
|
- More articles: [[<-- Prev]](/core-java-modules/core-java-lang-math-2)
|
||||||
|
@ -2,3 +2,7 @@
|
|||||||
|
|
||||||
### Relevant articles:
|
### Relevant articles:
|
||||||
- [Calculate Percentiles in Java](https://www.baeldung.com/java-compute-percentiles)
|
- [Calculate Percentiles in Java](https://www.baeldung.com/java-compute-percentiles)
|
||||||
|
- [Solving Rod Cutting Problem in Java](https://www.baeldung.com/java-rod-cutting-problem)
|
||||||
|
- [Rotate a Vertex Around a Certain Point in Java](https://www.baeldung.com/java-rotate-vertex-around-point)
|
||||||
|
- [Create a BMI Calculator in Java](https://www.baeldung.com/java-body-mass-index-calculator)
|
||||||
|
- [Check if a Point Is Between Two Points Drawn on a Straight Line in Java](https://www.baeldung.com/java-check-point-straight-line)
|
||||||
|
@ -12,4 +12,8 @@
|
|||||||
<version>0.0.1-SNAPSHOT</version>
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<java.version>17</java.version>
|
||||||
|
</properties>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
@ -0,0 +1,13 @@
|
|||||||
|
package com.baeldung.passclassasparameter;
|
||||||
|
|
||||||
|
public class Example {
|
||||||
|
public static void processClass(Class<?> clazz) {
|
||||||
|
System.out.println("Processing class: " + clazz.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
processClass(String.class);
|
||||||
|
processClass(Integer.class);
|
||||||
|
processClass(Double.class);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
package com.baeldung.passclassasparameter;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class GenericExample {
|
||||||
|
public static <T> void printListElements(Class<T> clazz, List<T> list) {
|
||||||
|
System.out.println("Elements of " + clazz.getSimpleName() + " list:");
|
||||||
|
for (T element : list) {
|
||||||
|
System.out.println(element);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
List<String> stringList = new ArrayList<>();
|
||||||
|
stringList.add("Java");
|
||||||
|
stringList.add("is");
|
||||||
|
stringList.add("awesome");
|
||||||
|
|
||||||
|
printListElements(String.class, stringList);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
package com.baeldung.passclassasparameter;
|
||||||
|
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
|
||||||
|
public class ReflectionExample {
|
||||||
|
public static void processClass(Class<?> clazz, String methodName) throws Exception {
|
||||||
|
Method method = clazz.getMethod(methodName);
|
||||||
|
Object instance = clazz.getDeclaredConstructor().newInstance();
|
||||||
|
method.invoke(instance);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) throws Exception {
|
||||||
|
processClass(ReflectionTarget.class, "sayHello");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ReflectionTarget {
|
||||||
|
public void sayHello() {
|
||||||
|
System.out.println("Hello, Reflection!");
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,43 @@
|
|||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class UseHashMapToConvertPhoneNumberInWordsToNumber {
|
||||||
|
private static Map<String, Integer> multipliers = Map.of("double",2,
|
||||||
|
"triple", 3,
|
||||||
|
"quadruple", 4);
|
||||||
|
private static Map<String, String> digits = Map.of("zero","1",
|
||||||
|
"one", "1",
|
||||||
|
"two", "2",
|
||||||
|
"three", "3",
|
||||||
|
"four", "4",
|
||||||
|
"five", "5",
|
||||||
|
"six", "6",
|
||||||
|
"seven", "7",
|
||||||
|
"eight", "8",
|
||||||
|
"nine", "9");
|
||||||
|
|
||||||
|
|
||||||
|
public static String convertPhoneNumberInWordsToNumber(String phoneNumberInWord) {
|
||||||
|
|
||||||
|
StringBuilder output = new StringBuilder();
|
||||||
|
Integer currentMultiplier = null;
|
||||||
|
String[] words = phoneNumberInWord.split(" ");
|
||||||
|
|
||||||
|
for (String word : words) {
|
||||||
|
Integer multiplier = multipliers.get(word);
|
||||||
|
if (multiplier != null) {
|
||||||
|
if (currentMultiplier != null) {
|
||||||
|
throw new IllegalArgumentException("Cannot have consecutive multipliers, at: " + word);
|
||||||
|
}
|
||||||
|
currentMultiplier = multiplier;
|
||||||
|
} else {
|
||||||
|
String digit = digits.get(word);
|
||||||
|
if (digit == null) {
|
||||||
|
throw new IllegalArgumentException("Invalid word: " + word);
|
||||||
|
}
|
||||||
|
output.append(digit.repeat(currentMultiplier != null ? currentMultiplier : 1));
|
||||||
|
currentMultiplier = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return output.toString();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,64 @@
|
|||||||
|
public class UseSwitchToConvertPhoneNumberInWordsToNumber {
|
||||||
|
|
||||||
|
public static String convertPhoneNumberInWordsToNumber(String phoneNumberInWord) {
|
||||||
|
|
||||||
|
StringBuilder output = new StringBuilder();
|
||||||
|
Integer currentMultiplier = null;
|
||||||
|
String[] words = phoneNumberInWord.split(" ");
|
||||||
|
|
||||||
|
for (String word : words) {
|
||||||
|
Integer multiplier = getWordAsMultiplier(word);
|
||||||
|
if (multiplier != null) {
|
||||||
|
if (currentMultiplier != null) {
|
||||||
|
throw new IllegalArgumentException("Cannot have consecutive multipliers, at: " + word);
|
||||||
|
}
|
||||||
|
currentMultiplier = multiplier;
|
||||||
|
} else {
|
||||||
|
output.append(getWordAsDigit(word).repeat(currentMultiplier != null ? currentMultiplier : 1));
|
||||||
|
currentMultiplier = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return output.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Integer getWordAsMultiplier(String word) {
|
||||||
|
switch (word) {
|
||||||
|
case "double":
|
||||||
|
return 2;
|
||||||
|
case "triple":
|
||||||
|
return 3;
|
||||||
|
case "quadruple":
|
||||||
|
return 4;
|
||||||
|
default:
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getWordAsDigit(String word) {
|
||||||
|
switch (word) {
|
||||||
|
case "zero":
|
||||||
|
return "0";
|
||||||
|
case "one":
|
||||||
|
return "1";
|
||||||
|
case "two":
|
||||||
|
return "2";
|
||||||
|
case "three":
|
||||||
|
return "3";
|
||||||
|
case "four":
|
||||||
|
return "4";
|
||||||
|
case "five":
|
||||||
|
return "5";
|
||||||
|
case "six":
|
||||||
|
return "6";
|
||||||
|
case "seven":
|
||||||
|
return "7";
|
||||||
|
case "eight":
|
||||||
|
return "8";
|
||||||
|
case "nine":
|
||||||
|
return "9";
|
||||||
|
default:
|
||||||
|
throw new IllegalArgumentException("Invalid word: " + word);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,31 @@
|
|||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import static org.junit.jupiter.api.Assertions.*;
|
||||||
|
|
||||||
|
class UseHashMapToConvertPhoneNumberInWordsToNumberUnitTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenStringWithWhiteSpaces_WhenConvertPhoneNumberInWordsToNumber_ThenEquivalentNumber() {
|
||||||
|
|
||||||
|
assertEquals("5248888",
|
||||||
|
UseHashMapToConvertPhoneNumberInWordsToNumber
|
||||||
|
.convertPhoneNumberInWordsToNumber("five two four quadruple eight"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenStringEndingWithConseutiveMultipliers_WhenConvertPhoneNumberInWordsToNumber_ThenThrowException() {
|
||||||
|
|
||||||
|
assertThrows(IllegalArgumentException.class, () -> {
|
||||||
|
UseHashMapToConvertPhoneNumberInWordsToNumber
|
||||||
|
.convertPhoneNumberInWordsToNumber("five eight three double triple");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenStringWithInvalidWords_WhenConvertPhoneNumberInWordsToNumber_ThenThrowException() {
|
||||||
|
|
||||||
|
assertThrows(IllegalArgumentException.class, () -> {
|
||||||
|
UseHashMapToConvertPhoneNumberInWordsToNumber
|
||||||
|
.convertPhoneNumberInWordsToNumber("five eight three two four penta null eight");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,62 @@
|
|||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.*;
|
||||||
|
|
||||||
|
class UseSwitchToConvertPhoneNumberInWordsToNumberUnitTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenStringWithWhiteSpaces_WhenConvertPhoneNumberInWordsToNumber_ThenEquivalentNumber() {
|
||||||
|
|
||||||
|
assertEquals("5248888",
|
||||||
|
UseSwitchToConvertPhoneNumberInWordsToNumber
|
||||||
|
.convertPhoneNumberInWordsToNumber("five two four quadruple eight"));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenStringEndingWithConseutiveMultipliers_WhenConvertPhoneNumberInWordsToNumber_ThenThrowException() {
|
||||||
|
|
||||||
|
assertThrows(IllegalArgumentException.class, () -> {
|
||||||
|
UseSwitchToConvertPhoneNumberInWordsToNumber
|
||||||
|
.convertPhoneNumberInWordsToNumber("five eight three double triple");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenStringWithInvalidWords_WhenConvertPhoneNumberInWordsToNumber_ThenThrowException() {
|
||||||
|
|
||||||
|
assertThrows(IllegalArgumentException.class, () -> {
|
||||||
|
UseSwitchToConvertPhoneNumberInWordsToNumber
|
||||||
|
.convertPhoneNumberInWordsToNumber("five eight three two four penta null eight");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenString_WhenGetWordAsMultiplier_ThenEquivalentNumber() {
|
||||||
|
assertEquals(2, UseSwitchToConvertPhoneNumberInWordsToNumber
|
||||||
|
.getWordAsMultiplier("double"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenInvalidString_WhenGetWordAsMultiplier_ThenReturnNull() {
|
||||||
|
assertEquals(null, UseSwitchToConvertPhoneNumberInWordsToNumber
|
||||||
|
.getWordAsMultiplier("hexa"));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenString_WhenMapIndividualDigits_ThenEquivalentNumber() {
|
||||||
|
assertEquals("5",
|
||||||
|
UseSwitchToConvertPhoneNumberInWordsToNumber
|
||||||
|
.getWordAsDigit("five"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenInvalidString_WhenMapIndividualDigits_ThenThrowException() {
|
||||||
|
assertThrows(IllegalArgumentException.class, () -> {
|
||||||
|
UseSwitchToConvertPhoneNumberInWordsToNumber
|
||||||
|
.convertPhoneNumberInWordsToNumber("penta");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,77 @@
|
|||||||
|
package com.baeldung.symmetricsubstringlength;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
|
public class SymmetricSubstringMaxLengthUnitTest {
|
||||||
|
String input = "<><??>>";
|
||||||
|
int expected = 4;
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenString_whenUsingSymmetricSubstringExpansion_thenFindLongestSymmetricSubstring() {
|
||||||
|
int start = 0;
|
||||||
|
int mid = 0;
|
||||||
|
int last_gt = 0;
|
||||||
|
int end = 0;
|
||||||
|
int best = 0;
|
||||||
|
|
||||||
|
while (start < input.length()) {
|
||||||
|
int current = Math.min(mid - start, end - mid);
|
||||||
|
if (best < current) {
|
||||||
|
best = current;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (end - mid == current && end < input.length()) {
|
||||||
|
if (input.charAt(end) == '?') {
|
||||||
|
end++;
|
||||||
|
} else if (input.charAt(end) == '>') {
|
||||||
|
end++;
|
||||||
|
last_gt = end;
|
||||||
|
} else {
|
||||||
|
end++;
|
||||||
|
mid = end;
|
||||||
|
start = Math.max(start, last_gt);
|
||||||
|
}
|
||||||
|
} else if (mid < input.length() && input.charAt(mid) == '?') {
|
||||||
|
mid++;
|
||||||
|
} else if (start < mid) {
|
||||||
|
start++;
|
||||||
|
} else {
|
||||||
|
start = Math.max(start, last_gt);
|
||||||
|
mid++;
|
||||||
|
end = Math.max(mid, end);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int result = 2 * best;
|
||||||
|
|
||||||
|
assertEquals(expected, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenString_whenUsingBruteForce_thenFindLongestSymmetricSubstring() {
|
||||||
|
int max = 0;
|
||||||
|
for (int i = 0; i < input.length(); i++) {
|
||||||
|
for (int j = i + 1; j <= input.length(); j++) {
|
||||||
|
String t = input.substring(i, j);
|
||||||
|
if (t.length() % 2 == 0) {
|
||||||
|
int k = 0, l = t.length() - 1;
|
||||||
|
boolean isSym = true;
|
||||||
|
while (k < l && isSym) {
|
||||||
|
if (!(t.charAt(k) == '<' || t.charAt(k) == '?') && (t.charAt(l) == '>' || t.charAt(l) == '?')) {
|
||||||
|
isSym = false;
|
||||||
|
}
|
||||||
|
k++;
|
||||||
|
l--;
|
||||||
|
}
|
||||||
|
if (isSym) {
|
||||||
|
max = Math.max(max, t.length());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
assertEquals(expected, max);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -89,6 +89,7 @@
|
|||||||
<module>core-java-collections-3</module>
|
<module>core-java-collections-3</module>
|
||||||
<module>core-java-collections-4</module>
|
<module>core-java-collections-4</module>
|
||||||
<module>core-java-collections-5</module>
|
<module>core-java-collections-5</module>
|
||||||
|
<module>core-java-collections-6</module>
|
||||||
<module>core-java-collections-conversions</module>
|
<module>core-java-collections-conversions</module>
|
||||||
<module>core-java-collections-set-2</module>
|
<module>core-java-collections-set-2</module>
|
||||||
<module>core-java-collections-list</module>
|
<module>core-java-collections-list</module>
|
||||||
|
@ -168,7 +168,7 @@
|
|||||||
</build>
|
</build>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<jcabi-aspects.version>0.22.6</jcabi-aspects.version>
|
<jcabi-aspects.version>0.26.0</jcabi-aspects.version>
|
||||||
<aspectjrt.version>1.9.20.1</aspectjrt.version>
|
<aspectjrt.version>1.9.20.1</aspectjrt.version>
|
||||||
<jcabi-maven-plugin.version>0.14.1</jcabi-maven-plugin.version>
|
<jcabi-maven-plugin.version>0.14.1</jcabi-maven-plugin.version>
|
||||||
<aspectjtools.version>1.9.20.1</aspectjtools.version>
|
<aspectjtools.version>1.9.20.1</aspectjtools.version>
|
||||||
|
@ -44,15 +44,27 @@
|
|||||||
<version>${mockftpserver.version}</version>
|
<version>${mockftpserver.version}</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.tukaani</groupId>
|
||||||
|
<artifactId>xz</artifactId>
|
||||||
|
<version>${xz.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.github.luben</groupId>
|
||||||
|
<artifactId>zstd-jni</artifactId>
|
||||||
|
<version>${zstd-jni.version}</version>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<commons-compress.version>1.23.0</commons-compress.version>
|
<commons-compress.version>1.26.1</commons-compress.version>
|
||||||
<ant.version>1.10.13</ant.version>
|
<ant.version>1.10.13</ant.version>
|
||||||
<commons-vfs2.version>2.9.0</commons-vfs2.version>
|
<commons-vfs2.version>2.9.0</commons-vfs2.version>
|
||||||
<apache-commons-text.version>1.10.0</apache-commons-text.version>
|
<apache-commons-text.version>1.10.0</apache-commons-text.version>
|
||||||
<commons-net.version>3.6</commons-net.version>
|
<commons-net.version>3.6</commons-net.version>
|
||||||
<mockftpserver.version>2.7.1</mockftpserver.version>
|
<mockftpserver.version>2.7.1</mockftpserver.version>
|
||||||
|
<xz.version>1.9</xz.version>
|
||||||
|
<zstd-jni.version>1.5.5-11</zstd-jni.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
</project>
|
</project>
|
@ -0,0 +1,119 @@
|
|||||||
|
package com.baeldung.commons.compress;
|
||||||
|
|
||||||
|
import java.io.BufferedInputStream;
|
||||||
|
import java.io.BufferedOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
import java.util.zip.Deflater;
|
||||||
|
import java.util.zip.ZipEntry;
|
||||||
|
|
||||||
|
import org.apache.commons.compress.archivers.ArchiveEntry;
|
||||||
|
import org.apache.commons.compress.archivers.ArchiveException;
|
||||||
|
import org.apache.commons.compress.archivers.ArchiveInputStream;
|
||||||
|
import org.apache.commons.compress.archivers.ArchiveOutputStream;
|
||||||
|
import org.apache.commons.compress.archivers.ArchiveStreamFactory;
|
||||||
|
import org.apache.commons.compress.archivers.examples.Archiver;
|
||||||
|
import org.apache.commons.compress.archivers.examples.Expander;
|
||||||
|
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
|
||||||
|
import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
|
||||||
|
import org.apache.commons.compress.compressors.CompressorException;
|
||||||
|
import org.apache.commons.compress.compressors.CompressorInputStream;
|
||||||
|
import org.apache.commons.compress.compressors.CompressorOutputStream;
|
||||||
|
import org.apache.commons.compress.compressors.CompressorStreamFactory;
|
||||||
|
import org.apache.commons.compress.utils.FileNameUtils;
|
||||||
|
import org.apache.commons.io.FilenameUtils;
|
||||||
|
import org.apache.commons.io.IOUtils;
|
||||||
|
|
||||||
|
public class CompressUtils {
|
||||||
|
|
||||||
|
private CompressUtils() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void archive(Path directory, Path destination) throws IOException, ArchiveException {
|
||||||
|
String format = FileNameUtils.getExtension(destination);
|
||||||
|
new Archiver().create(format, destination, directory);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void archiveAndCompress(String directory, Path destination) throws IOException, ArchiveException, CompressorException {
|
||||||
|
archiveAndCompress(Paths.get(directory), destination);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void archiveAndCompress(Path directory, Path destination) throws IOException, ArchiveException, CompressorException {
|
||||||
|
String compressionFormat = FileNameUtils.getExtension(destination);
|
||||||
|
String archiveFormat = FilenameUtils.getExtension(destination.getFileName()
|
||||||
|
.toString()
|
||||||
|
.replace("." + compressionFormat, ""));
|
||||||
|
|
||||||
|
try (OutputStream archive = Files.newOutputStream(destination);
|
||||||
|
BufferedOutputStream archiveBuffer = new BufferedOutputStream(archive);
|
||||||
|
CompressorOutputStream compressor = new CompressorStreamFactory().createCompressorOutputStream(compressionFormat, archiveBuffer);
|
||||||
|
ArchiveOutputStream<?> archiver = new ArchiveStreamFactory().createArchiveOutputStream(archiveFormat, compressor)) {
|
||||||
|
new Archiver().create(archiver, directory);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void decompress(Path file, Path destination) throws IOException, ArchiveException, CompressorException {
|
||||||
|
decompress(Files.newInputStream(file), destination);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void decompress(InputStream file, Path destination) throws IOException, ArchiveException, CompressorException {
|
||||||
|
try (InputStream in = file;
|
||||||
|
BufferedInputStream inputBuffer = new BufferedInputStream(in);
|
||||||
|
OutputStream out = Files.newOutputStream(destination);
|
||||||
|
CompressorInputStream decompressor = new CompressorStreamFactory().createCompressorInputStream(inputBuffer)) {
|
||||||
|
IOUtils.copy(decompressor, out);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void extract(Path archive, Path destination) throws IOException, ArchiveException, CompressorException {
|
||||||
|
new Expander().expand(archive, destination);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void compressFile(Path file, Path destination) throws IOException, CompressorException {
|
||||||
|
String format = FileNameUtils.getExtension(destination);
|
||||||
|
|
||||||
|
try (OutputStream out = Files.newOutputStream(destination);
|
||||||
|
BufferedOutputStream buffer = new BufferedOutputStream(out);
|
||||||
|
CompressorOutputStream compressor = new CompressorStreamFactory().createCompressorOutputStream(format, buffer)) {
|
||||||
|
IOUtils.copy(Files.newInputStream(file), compressor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void zip(Path file, Path destination) throws IOException {
|
||||||
|
try (InputStream input = Files.newInputStream(file);
|
||||||
|
OutputStream output = Files.newOutputStream(destination);
|
||||||
|
ZipArchiveOutputStream archive = new ZipArchiveOutputStream(output)) {
|
||||||
|
archive.setLevel(Deflater.BEST_COMPRESSION);
|
||||||
|
archive.setMethod(ZipEntry.DEFLATED);
|
||||||
|
|
||||||
|
archive.putArchiveEntry(new ZipArchiveEntry(file.getFileName()
|
||||||
|
.toString()));
|
||||||
|
IOUtils.copy(input, archive);
|
||||||
|
archive.closeArchiveEntry();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void extractOne(Path archivePath, String fileName, Path destinationDirectory) throws IOException, ArchiveException {
|
||||||
|
try (InputStream input = Files.newInputStream(archivePath);
|
||||||
|
BufferedInputStream buffer = new BufferedInputStream(input);
|
||||||
|
ArchiveInputStream<?> archive = new ArchiveStreamFactory().createArchiveInputStream(buffer)) {
|
||||||
|
|
||||||
|
ArchiveEntry entry;
|
||||||
|
while ((entry = archive.getNextEntry()) != null) {
|
||||||
|
if (entry.getName()
|
||||||
|
.equals(fileName)) {
|
||||||
|
Path outFile = destinationDirectory.resolve(fileName);
|
||||||
|
Files.createDirectories(outFile.getParent());
|
||||||
|
try (OutputStream os = Files.newOutputStream(outFile)) {
|
||||||
|
IOUtils.copy(archive, os);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,10 +1,10 @@
|
|||||||
package com.baeldung.commons.convertunicode;
|
package com.baeldung.commons.convertunicode;
|
||||||
|
|
||||||
import org.apache.commons.text.StringEscapeUtils;
|
|
||||||
|
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
import org.apache.commons.text.StringEscapeUtils;
|
||||||
|
|
||||||
public class UnicodeConverterUtil {
|
public class UnicodeConverterUtil {
|
||||||
|
|
||||||
public static String decodeWithApacheCommons(String input) {
|
public static String decodeWithApacheCommons(String input) {
|
||||||
@ -15,7 +15,7 @@ public class UnicodeConverterUtil {
|
|||||||
Pattern pattern = Pattern.compile("\\\\u[0-9a-fA-F]{4}");
|
Pattern pattern = Pattern.compile("\\\\u[0-9a-fA-F]{4}");
|
||||||
Matcher matcher = pattern.matcher(input);
|
Matcher matcher = pattern.matcher(input);
|
||||||
|
|
||||||
StringBuilder decodedString = new StringBuilder();
|
StringBuffer decodedString = new StringBuffer();
|
||||||
|
|
||||||
while (matcher.find()) {
|
while (matcher.find()) {
|
||||||
String unicodeSequence = matcher.group();
|
String unicodeSequence = matcher.group();
|
||||||
|
@ -0,0 +1,135 @@
|
|||||||
|
package com.baeldung.commons.compress;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.URISyntaxException;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
|
||||||
|
import org.apache.commons.compress.archivers.ArchiveException;
|
||||||
|
import org.apache.commons.compress.compressors.CompressorException;
|
||||||
|
import org.apache.commons.io.FileUtils;
|
||||||
|
import org.junit.jupiter.api.AfterAll;
|
||||||
|
import org.junit.jupiter.api.BeforeAll;
|
||||||
|
import org.junit.jupiter.api.MethodOrderer;
|
||||||
|
import org.junit.jupiter.api.Order;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.junit.jupiter.api.TestMethodOrder;
|
||||||
|
|
||||||
|
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
|
||||||
|
class CompressUtilsUnitTest {
|
||||||
|
|
||||||
|
static Path TMP;
|
||||||
|
static String ZIP_FILE = "new.txt.zip";
|
||||||
|
static String COMPRESSED_FILE = "new.txt.gz";
|
||||||
|
static String DECOMPRESSED_FILE = "decompressed-file.txt";
|
||||||
|
static String DECOMPRESSED_ARCHIVE = "decompressed-archive.tar";
|
||||||
|
static String COMPRESSED_ARCHIVE = "archive.tar.gz";
|
||||||
|
static String MODIFIED_ARCHIVE = "modified-archive.tar";
|
||||||
|
static String EXTRACTED_DIR = "extracted";
|
||||||
|
|
||||||
|
@BeforeAll
|
||||||
|
static void setup() throws IOException {
|
||||||
|
TMP = Files.createTempDirectory("compress-test")
|
||||||
|
.toAbsolutePath();
|
||||||
|
}
|
||||||
|
|
||||||
|
@AfterAll
|
||||||
|
static void destroy() throws IOException {
|
||||||
|
FileUtils.deleteDirectory(TMP.toFile());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Order(1)
|
||||||
|
void givenFile_whenCompressing_thenCompressed() throws IOException, CompressorException, URISyntaxException {
|
||||||
|
Path destination = TMP.resolve(COMPRESSED_FILE);
|
||||||
|
|
||||||
|
CompressUtils.compressFile(TestResources.testFile(), destination);
|
||||||
|
|
||||||
|
assertTrue(Files.isRegularFile(destination));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Order(2)
|
||||||
|
void givenFile_whenZipping_thenZipFileCreated() throws IOException, URISyntaxException {
|
||||||
|
Path destination = TMP.resolve(ZIP_FILE);
|
||||||
|
|
||||||
|
CompressUtils.zip(TestResources.testFile(), destination);
|
||||||
|
|
||||||
|
assertTrue(Files.isRegularFile(destination));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Order(3)
|
||||||
|
void givenCompressedArchive_whenDecompressing_thenArchiveAvailable() throws IOException, ArchiveException, CompressorException {
|
||||||
|
Path destination = TMP.resolve(DECOMPRESSED_ARCHIVE);
|
||||||
|
|
||||||
|
CompressUtils.decompress(TestResources.compressedArchive(), destination);
|
||||||
|
|
||||||
|
assertTrue(Files.isRegularFile(destination));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Order(4)
|
||||||
|
void givenCompressedFile_whenDecompressing_thenFileAvailable() throws IOException, ArchiveException, CompressorException {
|
||||||
|
Path destination = TMP.resolve(DECOMPRESSED_FILE);
|
||||||
|
|
||||||
|
CompressUtils.decompress(TMP.resolve(COMPRESSED_FILE), destination);
|
||||||
|
|
||||||
|
assertTrue(Files.isRegularFile(destination));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Order(5)
|
||||||
|
void givenDecompressedArchive_whenUnarchiving_thenFilesAvailable() throws IOException, ArchiveException, CompressorException {
|
||||||
|
Path destination = TMP.resolve(EXTRACTED_DIR);
|
||||||
|
|
||||||
|
CompressUtils.extract(TMP.resolve(DECOMPRESSED_ARCHIVE), destination);
|
||||||
|
|
||||||
|
assertTrue(Files.isDirectory(destination));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Order(6)
|
||||||
|
void givenDirectory_whenArchivingAndCompressing_thenCompressedArchiveAvailable() throws IOException, ArchiveException, CompressorException {
|
||||||
|
Path destination = TMP.resolve(COMPRESSED_ARCHIVE);
|
||||||
|
|
||||||
|
CompressUtils.archiveAndCompress(TMP.resolve(EXTRACTED_DIR), destination);
|
||||||
|
|
||||||
|
assertTrue(Files.isRegularFile(destination));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Order(7)
|
||||||
|
void givenExistingArchive_whenAddingSingleEntry_thenArchiveModified() throws IOException, ArchiveException, CompressorException, URISyntaxException {
|
||||||
|
Path archive = TMP.resolve(DECOMPRESSED_ARCHIVE);
|
||||||
|
Path newArchive = TMP.resolve(MODIFIED_ARCHIVE);
|
||||||
|
Path tmpDir = TMP.resolve(newArchive + "-tmpd");
|
||||||
|
|
||||||
|
Path newEntry = TestResources.testFile();
|
||||||
|
|
||||||
|
CompressUtils.extract(archive, tmpDir);
|
||||||
|
assertTrue(Files.isDirectory(tmpDir));
|
||||||
|
|
||||||
|
Files.copy(newEntry, tmpDir.resolve(newEntry.getFileName()));
|
||||||
|
CompressUtils.archive(tmpDir, newArchive);
|
||||||
|
assertTrue(Files.isRegularFile(newArchive));
|
||||||
|
|
||||||
|
FileUtils.deleteDirectory(tmpDir.toFile());
|
||||||
|
Files.delete(archive);
|
||||||
|
Files.move(newArchive, archive);
|
||||||
|
assertTrue(Files.isRegularFile(archive));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Order(8)
|
||||||
|
void givenExistingArchive_whenExtractingSingleEntry_thenFileExtracted() throws IOException, ArchiveException {
|
||||||
|
Path archive = TMP.resolve(DECOMPRESSED_ARCHIVE);
|
||||||
|
String targetFile = "sub/other.txt";
|
||||||
|
|
||||||
|
CompressUtils.extractOne(archive, targetFile, TMP);
|
||||||
|
|
||||||
|
assertTrue(Files.isRegularFile(TMP.resolve(targetFile)));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,25 @@
|
|||||||
|
package com.baeldung.commons.compress;
|
||||||
|
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.net.URISyntaxException;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
|
||||||
|
public interface TestResources {
|
||||||
|
|
||||||
|
String DIR = "/compress/";
|
||||||
|
|
||||||
|
static InputStream compressedArchive() {
|
||||||
|
return TestResources.class.getResourceAsStream(DIR + CompressUtilsUnitTest.COMPRESSED_ARCHIVE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Path testFile() throws URISyntaxException {
|
||||||
|
URL resource = TestResources.class.getResource(DIR + "new.txt");
|
||||||
|
if (resource == null) {
|
||||||
|
throw new IllegalArgumentException("file not found!");
|
||||||
|
} else {
|
||||||
|
return Paths.get(resource.toURI());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Binary file not shown.
@ -0,0 +1,2 @@
|
|||||||
|
lorem ipsum
|
||||||
|
dolor sit amet
|
@ -100,7 +100,7 @@
|
|||||||
<javatuples.version>1.2</javatuples.version>
|
<javatuples.version>1.2</javatuples.version>
|
||||||
<multiverse.version>0.7.0</multiverse.version>
|
<multiverse.version>0.7.0</multiverse.version>
|
||||||
<chronicle.map.version>3.24ea1</chronicle.map.version>
|
<chronicle.map.version>3.24ea1</chronicle.map.version>
|
||||||
<cactoos.version>0.43</cactoos.version>
|
<cactoos.version>0.55.0</cactoos.version>
|
||||||
<cache2k.version>1.2.3.Final</cache2k.version>
|
<cache2k.version>1.2.3.Final</cache2k.version>
|
||||||
<pcollections.version>2.1.2</pcollections.version>
|
<pcollections.version>2.1.2</pcollections.version>
|
||||||
<eclipse-collections.version>8.2.0</eclipse-collections.version>
|
<eclipse-collections.version>8.2.0</eclipse-collections.version>
|
||||||
|
@ -3,10 +3,13 @@ package com.baeldung.cactoos;
|
|||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.cactoos.collection.Filtered;
|
import org.cactoos.func.FuncOf;
|
||||||
|
import org.cactoos.iterable.Filtered;
|
||||||
import org.cactoos.iterable.IterableOf;
|
import org.cactoos.iterable.IterableOf;
|
||||||
|
import org.cactoos.iterable.Mapped;
|
||||||
import org.cactoos.list.ListOf;
|
import org.cactoos.list.ListOf;
|
||||||
import org.cactoos.scalar.And;
|
import org.cactoos.scalar.And;
|
||||||
|
import org.cactoos.scalar.True;
|
||||||
import org.cactoos.text.FormattedText;
|
import org.cactoos.text.FormattedText;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
@ -16,13 +19,24 @@ public class CactoosCollectionUtils {
|
|||||||
final Logger LOGGER = LoggerFactory.getLogger(CactoosCollectionUtils.class);
|
final Logger LOGGER = LoggerFactory.getLogger(CactoosCollectionUtils.class);
|
||||||
|
|
||||||
public void iterateCollection(List<String> strings) throws Exception {
|
public void iterateCollection(List<String> strings) throws Exception {
|
||||||
new And((String input) -> LOGGER.info(new FormattedText("%s\n", input).asString()), strings).value();
|
new And(
|
||||||
|
new Mapped<>(
|
||||||
|
new FuncOf<>(
|
||||||
|
input -> System.out.printf("Item: %s\n", input),
|
||||||
|
new True()
|
||||||
|
),
|
||||||
|
strings
|
||||||
|
)
|
||||||
|
).value();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Collection<String> getFilteredList(List<String> strings) {
|
public Collection<String> getFilteredList(List<String> strings) {
|
||||||
Collection<String> filteredStrings = new ListOf<>(
|
return new ListOf<>(
|
||||||
new Filtered<>(string -> string.length() == 5, new IterableOf<>(strings)));
|
new Filtered<>(
|
||||||
return filteredStrings;
|
s -> s.length() == 5,
|
||||||
|
strings
|
||||||
|
)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -10,17 +10,17 @@ import org.cactoos.text.Upper;
|
|||||||
|
|
||||||
public class CactoosStringUtils {
|
public class CactoosStringUtils {
|
||||||
|
|
||||||
public String createString() throws IOException {
|
public String createString() throws Exception {
|
||||||
String testString = new TextOf("Test String").asString();
|
String testString = new TextOf("Test String").asString();
|
||||||
return testString;
|
return testString;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String createdFormattedString(String stringToFormat) throws IOException {
|
public String createdFormattedString(String stringToFormat) throws Exception {
|
||||||
String formattedString = new FormattedText("Hello %s", stringToFormat).asString();
|
String formattedString = new FormattedText("Hello %s", stringToFormat).asString();
|
||||||
return formattedString;
|
return formattedString;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String toLowerCase(String testString) throws IOException {
|
public String toLowerCase(String testString) throws Exception {
|
||||||
String lowerCaseString = new Lowered(new TextOf(testString)).asString();
|
String lowerCaseString = new Lowered(new TextOf(testString)).asString();
|
||||||
return lowerCaseString;
|
return lowerCaseString;
|
||||||
}
|
}
|
||||||
|
@ -9,7 +9,7 @@ import org.junit.Test;
|
|||||||
public class CactoosStringUtilsUnitTest {
|
public class CactoosStringUtilsUnitTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void whenFormattedTextIsPassedWithArgs_thenFormattedStringIsReturned() throws IOException {
|
public void whenFormattedTextIsPassedWithArgs_thenFormattedStringIsReturned() throws Exception {
|
||||||
|
|
||||||
CactoosStringUtils obj = new CactoosStringUtils();
|
CactoosStringUtils obj = new CactoosStringUtils();
|
||||||
|
|
||||||
|
@ -0,0 +1,56 @@
|
|||||||
|
/*
|
||||||
|
* This file is generated by jOOQ.
|
||||||
|
*/
|
||||||
|
package com.baeldung.jooq.jointables;
|
||||||
|
|
||||||
|
|
||||||
|
import com.baeldung.jooq.jointables.public_.Public;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.jooq.Constants;
|
||||||
|
import org.jooq.Schema;
|
||||||
|
import org.jooq.impl.CatalogImpl;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class is generated by jOOQ.
|
||||||
|
*/
|
||||||
|
@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" })
|
||||||
|
public class DefaultCatalog extends CatalogImpl {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The reference instance of <code>DEFAULT_CATALOG</code>
|
||||||
|
*/
|
||||||
|
public static final DefaultCatalog DEFAULT_CATALOG = new DefaultCatalog();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The schema <code>public</code>.
|
||||||
|
*/
|
||||||
|
public final Public PUBLIC = Public.PUBLIC;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* No further instances allowed
|
||||||
|
*/
|
||||||
|
private DefaultCatalog() {
|
||||||
|
super("");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public final List<Schema> getSchemas() {
|
||||||
|
return Arrays.asList(
|
||||||
|
Public.PUBLIC
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A reference to the 3.19 minor release of the code generator. If this
|
||||||
|
* doesn't compile, it's because the runtime library uses an older minor
|
||||||
|
* release, namely: 3.19. You can turn off the generation of this reference
|
||||||
|
* by specifying /configuration/generator/generate/jooqVersionReference
|
||||||
|
*/
|
||||||
|
private static final String REQUIRE_RUNTIME_JOOQ_VERSION = Constants.VERSION_3_19;
|
||||||
|
}
|
@ -0,0 +1,75 @@
|
|||||||
|
package com.baeldung.jooq.jointables;
|
||||||
|
|
||||||
|
import static org.jooq.impl.DSL.field;
|
||||||
|
|
||||||
|
import org.jooq.DSLContext;
|
||||||
|
import org.jooq.Record;
|
||||||
|
import org.jooq.Result;
|
||||||
|
import org.jooq.SelectJoinStep;
|
||||||
|
|
||||||
|
import com.baeldung.jooq.jointables.public_.Tables;
|
||||||
|
|
||||||
|
public class JoinTables {
|
||||||
|
|
||||||
|
public static Result<Record> usingJoinMethod(DSLContext context) {
|
||||||
|
SelectJoinStep<Record> query = context.select()
|
||||||
|
.from(Tables.BOOK)
|
||||||
|
.join(Tables.BOOKAUTHOR)
|
||||||
|
.on(field(Tables.BOOK.AUTHOR_ID).eq(field(Tables.BOOKAUTHOR.ID)));
|
||||||
|
return query.fetch();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Result<Record> usingMultipleJoinMethod(DSLContext context) {
|
||||||
|
SelectJoinStep<Record> query = context.select()
|
||||||
|
.from(Tables.BOOK)
|
||||||
|
.join(Tables.BOOKAUTHOR)
|
||||||
|
.on(field(Tables.BOOK.AUTHOR_ID).eq(field(Tables.BOOKAUTHOR.ID)))
|
||||||
|
.join(Tables.STORE)
|
||||||
|
.on(field(Tables.BOOK.STORE_ID).eq(field(Tables.STORE.ID)));
|
||||||
|
return query.fetch();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Result<Record> usingLeftOuterJoinMethod(DSLContext context) {
|
||||||
|
SelectJoinStep<Record> query = context.select()
|
||||||
|
.from(Tables.BOOK)
|
||||||
|
.leftOuterJoin(Tables.BOOKAUTHOR)
|
||||||
|
.on(field(Tables.BOOK.AUTHOR_ID).eq(field(Tables.BOOKAUTHOR.ID)));
|
||||||
|
return query.fetch();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Result<Record> usingRightOuterJoinMethod(DSLContext context) {
|
||||||
|
SelectJoinStep<Record> query = context.select()
|
||||||
|
.from(Tables.BOOK)
|
||||||
|
.rightOuterJoin(Tables.BOOKAUTHOR)
|
||||||
|
.on(field(Tables.BOOK.AUTHOR_ID).eq(field(Tables.BOOKAUTHOR.ID)));
|
||||||
|
return query.fetch();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Result<Record> usingFullOuterJoinMethod(DSLContext context) {
|
||||||
|
SelectJoinStep<Record> query = context.select()
|
||||||
|
.from(Tables.BOOK)
|
||||||
|
.fullOuterJoin(Tables.BOOKAUTHOR)
|
||||||
|
.on(field(Tables.BOOK.AUTHOR_ID).eq(field(Tables.BOOKAUTHOR.ID)));
|
||||||
|
return query.fetch();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Result<Record> usingNaturalJoinMethod(DSLContext context) {
|
||||||
|
SelectJoinStep<Record> query = context.select()
|
||||||
|
.from(Tables.BOOK)
|
||||||
|
.naturalJoin(Tables.BOOKAUTHOR);
|
||||||
|
return query.fetch();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Result<Record> usingCrossJoinMethod(DSLContext context) {
|
||||||
|
SelectJoinStep<Record> query = context.select()
|
||||||
|
.from(Tables.STORE)
|
||||||
|
.crossJoin(Tables.BOOK);
|
||||||
|
return query.fetch();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void printResult(Result<Record> result) {
|
||||||
|
for (Record record : result) {
|
||||||
|
System.out.println(record);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,34 @@
|
|||||||
|
/*
|
||||||
|
* This file is generated by jOOQ.
|
||||||
|
*/
|
||||||
|
package com.baeldung.jooq.jointables.public_;
|
||||||
|
|
||||||
|
|
||||||
|
import com.baeldung.jooq.jointables.public_.tables.Book;
|
||||||
|
import com.baeldung.jooq.jointables.public_.tables.Bookauthor;
|
||||||
|
import com.baeldung.jooq.jointables.public_.tables.Store;
|
||||||
|
import com.baeldung.jooq.jointables.public_.tables.records.BookRecord;
|
||||||
|
import com.baeldung.jooq.jointables.public_.tables.records.BookauthorRecord;
|
||||||
|
import com.baeldung.jooq.jointables.public_.tables.records.StoreRecord;
|
||||||
|
|
||||||
|
import org.jooq.TableField;
|
||||||
|
import org.jooq.UniqueKey;
|
||||||
|
import org.jooq.impl.DSL;
|
||||||
|
import org.jooq.impl.Internal;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A class modelling foreign key relationships and constraints of tables in
|
||||||
|
* public.
|
||||||
|
*/
|
||||||
|
@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" })
|
||||||
|
public class Keys {
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------------
|
||||||
|
// UNIQUE and PRIMARY KEY definitions
|
||||||
|
// -------------------------------------------------------------------------
|
||||||
|
|
||||||
|
public static final UniqueKey<BookRecord> BOOK_PKEY = Internal.createUniqueKey(Book.BOOK, DSL.name("Book_pkey"), new TableField[] { Book.BOOK.ID }, true);
|
||||||
|
public static final UniqueKey<BookauthorRecord> AUTHOR_PKEY = Internal.createUniqueKey(Bookauthor.BOOKAUTHOR, DSL.name("Author_pkey"), new TableField[] { Bookauthor.BOOKAUTHOR.ID }, true);
|
||||||
|
public static final UniqueKey<StoreRecord> STORE_PKEY = Internal.createUniqueKey(Store.STORE, DSL.name("Store_pkey"), new TableField[] { Store.STORE.ID }, true);
|
||||||
|
}
|
@ -0,0 +1,69 @@
|
|||||||
|
/*
|
||||||
|
* This file is generated by jOOQ.
|
||||||
|
*/
|
||||||
|
package com.baeldung.jooq.jointables.public_;
|
||||||
|
|
||||||
|
|
||||||
|
import com.baeldung.jooq.jointables.DefaultCatalog;
|
||||||
|
import com.baeldung.jooq.jointables.public_.tables.Book;
|
||||||
|
import com.baeldung.jooq.jointables.public_.tables.Bookauthor;
|
||||||
|
import com.baeldung.jooq.jointables.public_.tables.Store;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.jooq.Catalog;
|
||||||
|
import org.jooq.Table;
|
||||||
|
import org.jooq.impl.SchemaImpl;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class is generated by jOOQ.
|
||||||
|
*/
|
||||||
|
@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" })
|
||||||
|
public class Public extends SchemaImpl {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The reference instance of <code>public</code>
|
||||||
|
*/
|
||||||
|
public static final Public PUBLIC = new Public();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The table <code>public.Book</code>.
|
||||||
|
*/
|
||||||
|
public final Book BOOK = Book.BOOK;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The table <code>public.BookAuthor</code>.
|
||||||
|
*/
|
||||||
|
public final Bookauthor BOOKAUTHOR = Bookauthor.BOOKAUTHOR;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The table <code>public.Store</code>.
|
||||||
|
*/
|
||||||
|
public final Store STORE = Store.STORE;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* No further instances allowed
|
||||||
|
*/
|
||||||
|
private Public() {
|
||||||
|
super("public", null);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Catalog getCatalog() {
|
||||||
|
return DefaultCatalog.DEFAULT_CATALOG;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public final List<Table<?>> getTables() {
|
||||||
|
return Arrays.asList(
|
||||||
|
Book.BOOK,
|
||||||
|
Bookauthor.BOOKAUTHOR,
|
||||||
|
Store.STORE
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
/*
|
||||||
|
* This file is generated by jOOQ.
|
||||||
|
*/
|
||||||
|
package com.baeldung.jooq.jointables.public_;
|
||||||
|
|
||||||
|
|
||||||
|
import com.baeldung.jooq.jointables.public_.tables.Book;
|
||||||
|
import com.baeldung.jooq.jointables.public_.tables.Bookauthor;
|
||||||
|
import com.baeldung.jooq.jointables.public_.tables.Store;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convenience access to all tables in public.
|
||||||
|
*/
|
||||||
|
@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" })
|
||||||
|
public class Tables {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The table <code>public.Book</code>.
|
||||||
|
*/
|
||||||
|
public static final Book BOOK = Book.BOOK;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The table <code>public.BookAuthor</code>.
|
||||||
|
*/
|
||||||
|
public static final Bookauthor BOOKAUTHOR = Bookauthor.BOOKAUTHOR;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The table <code>public.Store</code>.
|
||||||
|
*/
|
||||||
|
public static final Store STORE = Store.STORE;
|
||||||
|
}
|
@ -0,0 +1,238 @@
|
|||||||
|
/*
|
||||||
|
* This file is generated by jOOQ.
|
||||||
|
*/
|
||||||
|
package com.baeldung.jooq.jointables.public_.tables;
|
||||||
|
|
||||||
|
|
||||||
|
import com.baeldung.jooq.jointables.public_.Keys;
|
||||||
|
import com.baeldung.jooq.jointables.public_.Public;
|
||||||
|
import com.baeldung.jooq.jointables.public_.tables.records.BookRecord;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
|
||||||
|
import org.jooq.Condition;
|
||||||
|
import org.jooq.Field;
|
||||||
|
import org.jooq.Name;
|
||||||
|
import org.jooq.PlainSQL;
|
||||||
|
import org.jooq.QueryPart;
|
||||||
|
import org.jooq.SQL;
|
||||||
|
import org.jooq.Schema;
|
||||||
|
import org.jooq.Select;
|
||||||
|
import org.jooq.Stringly;
|
||||||
|
import org.jooq.Table;
|
||||||
|
import org.jooq.TableField;
|
||||||
|
import org.jooq.TableOptions;
|
||||||
|
import org.jooq.UniqueKey;
|
||||||
|
import org.jooq.impl.DSL;
|
||||||
|
import org.jooq.impl.SQLDataType;
|
||||||
|
import org.jooq.impl.TableImpl;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class is generated by jOOQ.
|
||||||
|
*/
|
||||||
|
@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" })
|
||||||
|
public class Book extends TableImpl<BookRecord> {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The reference instance of <code>public.Book</code>
|
||||||
|
*/
|
||||||
|
public static final Book BOOK = new Book();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The class holding records for this type
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Class<BookRecord> getRecordType() {
|
||||||
|
return BookRecord.class;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The column <code>public.Book.id</code>.
|
||||||
|
*/
|
||||||
|
public final TableField<BookRecord, Integer> ID = createField(DSL.name("id"), SQLDataType.INTEGER.nullable(false), this, "");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The column <code>public.Book.author_id</code>.
|
||||||
|
*/
|
||||||
|
public final TableField<BookRecord, Integer> AUTHOR_ID = createField(DSL.name("author_id"), SQLDataType.INTEGER, this, "");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The column <code>public.Book.title</code>.
|
||||||
|
*/
|
||||||
|
public final TableField<BookRecord, String> TITLE = createField(DSL.name("title"), SQLDataType.VARCHAR, this, "");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The column <code>public.Book.description</code>.
|
||||||
|
*/
|
||||||
|
public final TableField<BookRecord, String> DESCRIPTION = createField(DSL.name("description"), SQLDataType.VARCHAR, this, "");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The column <code>public.Book.store_id</code>.
|
||||||
|
*/
|
||||||
|
public final TableField<BookRecord, Integer> STORE_ID = createField(DSL.name("store_id"), SQLDataType.INTEGER, this, "");
|
||||||
|
|
||||||
|
private Book(Name alias, Table<BookRecord> aliased) {
|
||||||
|
this(alias, aliased, (Field<?>[]) null, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Book(Name alias, Table<BookRecord> aliased, Field<?>[] parameters, Condition where) {
|
||||||
|
super(alias, null, aliased, parameters, DSL.comment(""), TableOptions.table(), where);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an aliased <code>public.Book</code> table reference
|
||||||
|
*/
|
||||||
|
public Book(String alias) {
|
||||||
|
this(DSL.name(alias), BOOK);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an aliased <code>public.Book</code> table reference
|
||||||
|
*/
|
||||||
|
public Book(Name alias) {
|
||||||
|
this(alias, BOOK);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a <code>public.Book</code> table reference
|
||||||
|
*/
|
||||||
|
public Book() {
|
||||||
|
this(DSL.name("Book"), null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Schema getSchema() {
|
||||||
|
return aliased() ? null : Public.PUBLIC;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public UniqueKey<BookRecord> getPrimaryKey() {
|
||||||
|
return Keys.BOOK_PKEY;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Book as(String alias) {
|
||||||
|
return new Book(DSL.name(alias), this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Book as(Name alias) {
|
||||||
|
return new Book(alias, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Book as(Table<?> alias) {
|
||||||
|
return new Book(alias.getQualifiedName(), this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Rename this table
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Book rename(String name) {
|
||||||
|
return new Book(DSL.name(name), null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Rename this table
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Book rename(Name name) {
|
||||||
|
return new Book(name, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Rename this table
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Book rename(Table<?> name) {
|
||||||
|
return new Book(name.getQualifiedName(), null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an inline derived table from this table
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Book where(Condition condition) {
|
||||||
|
return new Book(getQualifiedName(), aliased() ? this : null, null, condition);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an inline derived table from this table
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Book where(Collection<? extends Condition> conditions) {
|
||||||
|
return where(DSL.and(conditions));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an inline derived table from this table
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Book where(Condition... conditions) {
|
||||||
|
return where(DSL.and(conditions));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an inline derived table from this table
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Book where(Field<Boolean> condition) {
|
||||||
|
return where(DSL.condition(condition));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an inline derived table from this table
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
@PlainSQL
|
||||||
|
public Book where(SQL condition) {
|
||||||
|
return where(DSL.condition(condition));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an inline derived table from this table
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
@PlainSQL
|
||||||
|
public Book where(@Stringly.SQL String condition) {
|
||||||
|
return where(DSL.condition(condition));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an inline derived table from this table
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
@PlainSQL
|
||||||
|
public Book where(@Stringly.SQL String condition, Object... binds) {
|
||||||
|
return where(DSL.condition(condition, binds));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an inline derived table from this table
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
@PlainSQL
|
||||||
|
public Book where(@Stringly.SQL String condition, QueryPart... parts) {
|
||||||
|
return where(DSL.condition(condition, parts));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an inline derived table from this table
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Book whereExists(Select<?> select) {
|
||||||
|
return where(DSL.exists(select));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an inline derived table from this table
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Book whereNotExists(Select<?> select) {
|
||||||
|
return where(DSL.notExists(select));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,228 @@
|
|||||||
|
/*
|
||||||
|
* This file is generated by jOOQ.
|
||||||
|
*/
|
||||||
|
package com.baeldung.jooq.jointables.public_.tables;
|
||||||
|
|
||||||
|
|
||||||
|
import com.baeldung.jooq.jointables.public_.Keys;
|
||||||
|
import com.baeldung.jooq.jointables.public_.Public;
|
||||||
|
import com.baeldung.jooq.jointables.public_.tables.records.BookauthorRecord;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
|
||||||
|
import org.jooq.Condition;
|
||||||
|
import org.jooq.Field;
|
||||||
|
import org.jooq.Name;
|
||||||
|
import org.jooq.PlainSQL;
|
||||||
|
import org.jooq.QueryPart;
|
||||||
|
import org.jooq.SQL;
|
||||||
|
import org.jooq.Schema;
|
||||||
|
import org.jooq.Select;
|
||||||
|
import org.jooq.Stringly;
|
||||||
|
import org.jooq.Table;
|
||||||
|
import org.jooq.TableField;
|
||||||
|
import org.jooq.TableOptions;
|
||||||
|
import org.jooq.UniqueKey;
|
||||||
|
import org.jooq.impl.DSL;
|
||||||
|
import org.jooq.impl.SQLDataType;
|
||||||
|
import org.jooq.impl.TableImpl;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class is generated by jOOQ.
|
||||||
|
*/
|
||||||
|
@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" })
|
||||||
|
public class Bookauthor extends TableImpl<BookauthorRecord> {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The reference instance of <code>public.BookAuthor</code>
|
||||||
|
*/
|
||||||
|
public static final Bookauthor BOOKAUTHOR = new Bookauthor();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The class holding records for this type
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Class<BookauthorRecord> getRecordType() {
|
||||||
|
return BookauthorRecord.class;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The column <code>public.BookAuthor.id</code>.
|
||||||
|
*/
|
||||||
|
public final TableField<BookauthorRecord, Integer> ID = createField(DSL.name("id"), SQLDataType.INTEGER.nullable(false), this, "");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The column <code>public.BookAuthor.name</code>.
|
||||||
|
*/
|
||||||
|
public final TableField<BookauthorRecord, String> NAME = createField(DSL.name("name"), SQLDataType.VARCHAR.nullable(false), this, "");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The column <code>public.BookAuthor.country</code>.
|
||||||
|
*/
|
||||||
|
public final TableField<BookauthorRecord, String> COUNTRY = createField(DSL.name("country"), SQLDataType.VARCHAR, this, "");
|
||||||
|
|
||||||
|
private Bookauthor(Name alias, Table<BookauthorRecord> aliased) {
|
||||||
|
this(alias, aliased, (Field<?>[]) null, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Bookauthor(Name alias, Table<BookauthorRecord> aliased, Field<?>[] parameters, Condition where) {
|
||||||
|
super(alias, null, aliased, parameters, DSL.comment(""), TableOptions.table(), where);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an aliased <code>public.BookAuthor</code> table reference
|
||||||
|
*/
|
||||||
|
public Bookauthor(String alias) {
|
||||||
|
this(DSL.name(alias), BOOKAUTHOR);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an aliased <code>public.BookAuthor</code> table reference
|
||||||
|
*/
|
||||||
|
public Bookauthor(Name alias) {
|
||||||
|
this(alias, BOOKAUTHOR);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a <code>public.BookAuthor</code> table reference
|
||||||
|
*/
|
||||||
|
public Bookauthor() {
|
||||||
|
this(DSL.name("BookAuthor"), null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Schema getSchema() {
|
||||||
|
return aliased() ? null : Public.PUBLIC;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public UniqueKey<BookauthorRecord> getPrimaryKey() {
|
||||||
|
return Keys.AUTHOR_PKEY;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Bookauthor as(String alias) {
|
||||||
|
return new Bookauthor(DSL.name(alias), this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Bookauthor as(Name alias) {
|
||||||
|
return new Bookauthor(alias, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Bookauthor as(Table<?> alias) {
|
||||||
|
return new Bookauthor(alias.getQualifiedName(), this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Rename this table
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Bookauthor rename(String name) {
|
||||||
|
return new Bookauthor(DSL.name(name), null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Rename this table
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Bookauthor rename(Name name) {
|
||||||
|
return new Bookauthor(name, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Rename this table
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Bookauthor rename(Table<?> name) {
|
||||||
|
return new Bookauthor(name.getQualifiedName(), null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an inline derived table from this table
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Bookauthor where(Condition condition) {
|
||||||
|
return new Bookauthor(getQualifiedName(), aliased() ? this : null, null, condition);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an inline derived table from this table
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Bookauthor where(Collection<? extends Condition> conditions) {
|
||||||
|
return where(DSL.and(conditions));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an inline derived table from this table
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Bookauthor where(Condition... conditions) {
|
||||||
|
return where(DSL.and(conditions));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an inline derived table from this table
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Bookauthor where(Field<Boolean> condition) {
|
||||||
|
return where(DSL.condition(condition));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an inline derived table from this table
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
@PlainSQL
|
||||||
|
public Bookauthor where(SQL condition) {
|
||||||
|
return where(DSL.condition(condition));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an inline derived table from this table
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
@PlainSQL
|
||||||
|
public Bookauthor where(@Stringly.SQL String condition) {
|
||||||
|
return where(DSL.condition(condition));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an inline derived table from this table
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
@PlainSQL
|
||||||
|
public Bookauthor where(@Stringly.SQL String condition, Object... binds) {
|
||||||
|
return where(DSL.condition(condition, binds));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an inline derived table from this table
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
@PlainSQL
|
||||||
|
public Bookauthor where(@Stringly.SQL String condition, QueryPart... parts) {
|
||||||
|
return where(DSL.condition(condition, parts));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an inline derived table from this table
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Bookauthor whereExists(Select<?> select) {
|
||||||
|
return where(DSL.exists(select));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an inline derived table from this table
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Bookauthor whereNotExists(Select<?> select) {
|
||||||
|
return where(DSL.notExists(select));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,223 @@
|
|||||||
|
/*
|
||||||
|
* This file is generated by jOOQ.
|
||||||
|
*/
|
||||||
|
package com.baeldung.jooq.jointables.public_.tables;
|
||||||
|
|
||||||
|
|
||||||
|
import com.baeldung.jooq.jointables.public_.Keys;
|
||||||
|
import com.baeldung.jooq.jointables.public_.Public;
|
||||||
|
import com.baeldung.jooq.jointables.public_.tables.records.StoreRecord;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
|
||||||
|
import org.jooq.Condition;
|
||||||
|
import org.jooq.Field;
|
||||||
|
import org.jooq.Name;
|
||||||
|
import org.jooq.PlainSQL;
|
||||||
|
import org.jooq.QueryPart;
|
||||||
|
import org.jooq.SQL;
|
||||||
|
import org.jooq.Schema;
|
||||||
|
import org.jooq.Select;
|
||||||
|
import org.jooq.Stringly;
|
||||||
|
import org.jooq.Table;
|
||||||
|
import org.jooq.TableField;
|
||||||
|
import org.jooq.TableOptions;
|
||||||
|
import org.jooq.UniqueKey;
|
||||||
|
import org.jooq.impl.DSL;
|
||||||
|
import org.jooq.impl.SQLDataType;
|
||||||
|
import org.jooq.impl.TableImpl;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class is generated by jOOQ.
|
||||||
|
*/
|
||||||
|
@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" })
|
||||||
|
public class Store extends TableImpl<StoreRecord> {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The reference instance of <code>public.Store</code>
|
||||||
|
*/
|
||||||
|
public static final Store STORE = new Store();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The class holding records for this type
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Class<StoreRecord> getRecordType() {
|
||||||
|
return StoreRecord.class;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The column <code>public.Store.id</code>.
|
||||||
|
*/
|
||||||
|
public final TableField<StoreRecord, Integer> ID = createField(DSL.name("id"), SQLDataType.INTEGER.nullable(false), this, "");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The column <code>public.Store.name</code>.
|
||||||
|
*/
|
||||||
|
public final TableField<StoreRecord, String> NAME = createField(DSL.name("name"), SQLDataType.VARCHAR.nullable(false), this, "");
|
||||||
|
|
||||||
|
private Store(Name alias, Table<StoreRecord> aliased) {
|
||||||
|
this(alias, aliased, (Field<?>[]) null, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Store(Name alias, Table<StoreRecord> aliased, Field<?>[] parameters, Condition where) {
|
||||||
|
super(alias, null, aliased, parameters, DSL.comment(""), TableOptions.table(), where);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an aliased <code>public.Store</code> table reference
|
||||||
|
*/
|
||||||
|
public Store(String alias) {
|
||||||
|
this(DSL.name(alias), STORE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an aliased <code>public.Store</code> table reference
|
||||||
|
*/
|
||||||
|
public Store(Name alias) {
|
||||||
|
this(alias, STORE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a <code>public.Store</code> table reference
|
||||||
|
*/
|
||||||
|
public Store() {
|
||||||
|
this(DSL.name("Store"), null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Schema getSchema() {
|
||||||
|
return aliased() ? null : Public.PUBLIC;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public UniqueKey<StoreRecord> getPrimaryKey() {
|
||||||
|
return Keys.STORE_PKEY;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Store as(String alias) {
|
||||||
|
return new Store(DSL.name(alias), this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Store as(Name alias) {
|
||||||
|
return new Store(alias, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Store as(Table<?> alias) {
|
||||||
|
return new Store(alias.getQualifiedName(), this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Rename this table
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Store rename(String name) {
|
||||||
|
return new Store(DSL.name(name), null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Rename this table
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Store rename(Name name) {
|
||||||
|
return new Store(name, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Rename this table
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Store rename(Table<?> name) {
|
||||||
|
return new Store(name.getQualifiedName(), null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an inline derived table from this table
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Store where(Condition condition) {
|
||||||
|
return new Store(getQualifiedName(), aliased() ? this : null, null, condition);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an inline derived table from this table
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Store where(Collection<? extends Condition> conditions) {
|
||||||
|
return where(DSL.and(conditions));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an inline derived table from this table
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Store where(Condition... conditions) {
|
||||||
|
return where(DSL.and(conditions));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an inline derived table from this table
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Store where(Field<Boolean> condition) {
|
||||||
|
return where(DSL.condition(condition));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an inline derived table from this table
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
@PlainSQL
|
||||||
|
public Store where(SQL condition) {
|
||||||
|
return where(DSL.condition(condition));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an inline derived table from this table
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
@PlainSQL
|
||||||
|
public Store where(@Stringly.SQL String condition) {
|
||||||
|
return where(DSL.condition(condition));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an inline derived table from this table
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
@PlainSQL
|
||||||
|
public Store where(@Stringly.SQL String condition, Object... binds) {
|
||||||
|
return where(DSL.condition(condition, binds));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an inline derived table from this table
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
@PlainSQL
|
||||||
|
public Store where(@Stringly.SQL String condition, QueryPart... parts) {
|
||||||
|
return where(DSL.condition(condition, parts));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an inline derived table from this table
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Store whereExists(Select<?> select) {
|
||||||
|
return where(DSL.exists(select));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an inline derived table from this table
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Store whereNotExists(Select<?> select) {
|
||||||
|
return where(DSL.notExists(select));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,124 @@
|
|||||||
|
/*
|
||||||
|
* This file is generated by jOOQ.
|
||||||
|
*/
|
||||||
|
package com.baeldung.jooq.jointables.public_.tables.records;
|
||||||
|
|
||||||
|
|
||||||
|
import com.baeldung.jooq.jointables.public_.tables.Book;
|
||||||
|
|
||||||
|
import org.jooq.Record1;
|
||||||
|
import org.jooq.impl.UpdatableRecordImpl;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class is generated by jOOQ.
|
||||||
|
*/
|
||||||
|
@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" })
|
||||||
|
public class BookRecord extends UpdatableRecordImpl<BookRecord> {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Setter for <code>public.Book.id</code>.
|
||||||
|
*/
|
||||||
|
public void setId(Integer value) {
|
||||||
|
set(0, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Getter for <code>public.Book.id</code>.
|
||||||
|
*/
|
||||||
|
public Integer getId() {
|
||||||
|
return (Integer) get(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Setter for <code>public.Book.author_id</code>.
|
||||||
|
*/
|
||||||
|
public void setAuthorId(Integer value) {
|
||||||
|
set(1, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Getter for <code>public.Book.author_id</code>.
|
||||||
|
*/
|
||||||
|
public Integer getAuthorId() {
|
||||||
|
return (Integer) get(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Setter for <code>public.Book.title</code>.
|
||||||
|
*/
|
||||||
|
public void setTitle(String value) {
|
||||||
|
set(2, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Getter for <code>public.Book.title</code>.
|
||||||
|
*/
|
||||||
|
public String getTitle() {
|
||||||
|
return (String) get(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Setter for <code>public.Book.description</code>.
|
||||||
|
*/
|
||||||
|
public void setDescription(String value) {
|
||||||
|
set(3, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Getter for <code>public.Book.description</code>.
|
||||||
|
*/
|
||||||
|
public String getDescription() {
|
||||||
|
return (String) get(3);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Setter for <code>public.Book.store_id</code>.
|
||||||
|
*/
|
||||||
|
public void setStoreId(Integer value) {
|
||||||
|
set(4, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Getter for <code>public.Book.store_id</code>.
|
||||||
|
*/
|
||||||
|
public Integer getStoreId() {
|
||||||
|
return (Integer) get(4);
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------------
|
||||||
|
// Primary key information
|
||||||
|
// -------------------------------------------------------------------------
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Record1<Integer> key() {
|
||||||
|
return (Record1) super.key();
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------------
|
||||||
|
// Constructors
|
||||||
|
// -------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a detached BookRecord
|
||||||
|
*/
|
||||||
|
public BookRecord() {
|
||||||
|
super(Book.BOOK);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a detached, initialised BookRecord
|
||||||
|
*/
|
||||||
|
public BookRecord(Integer id, Integer authorId, String title, String description, Integer storeId) {
|
||||||
|
super(Book.BOOK);
|
||||||
|
|
||||||
|
setId(id);
|
||||||
|
setAuthorId(authorId);
|
||||||
|
setTitle(title);
|
||||||
|
setDescription(description);
|
||||||
|
setStoreId(storeId);
|
||||||
|
resetChangedOnNotNull();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,94 @@
|
|||||||
|
/*
|
||||||
|
* This file is generated by jOOQ.
|
||||||
|
*/
|
||||||
|
package com.baeldung.jooq.jointables.public_.tables.records;
|
||||||
|
|
||||||
|
|
||||||
|
import com.baeldung.jooq.jointables.public_.tables.Bookauthor;
|
||||||
|
|
||||||
|
import org.jooq.Record1;
|
||||||
|
import org.jooq.impl.UpdatableRecordImpl;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class is generated by jOOQ.
|
||||||
|
*/
|
||||||
|
@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" })
|
||||||
|
public class BookauthorRecord extends UpdatableRecordImpl<BookauthorRecord> {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Setter for <code>public.BookAuthor.id</code>.
|
||||||
|
*/
|
||||||
|
public void setId(Integer value) {
|
||||||
|
set(0, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Getter for <code>public.BookAuthor.id</code>.
|
||||||
|
*/
|
||||||
|
public Integer getId() {
|
||||||
|
return (Integer) get(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Setter for <code>public.BookAuthor.name</code>.
|
||||||
|
*/
|
||||||
|
public void setName(String value) {
|
||||||
|
set(1, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Getter for <code>public.BookAuthor.name</code>.
|
||||||
|
*/
|
||||||
|
public String getName() {
|
||||||
|
return (String) get(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Setter for <code>public.BookAuthor.country</code>.
|
||||||
|
*/
|
||||||
|
public void setCountry(String value) {
|
||||||
|
set(2, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Getter for <code>public.BookAuthor.country</code>.
|
||||||
|
*/
|
||||||
|
public String getCountry() {
|
||||||
|
return (String) get(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------------
|
||||||
|
// Primary key information
|
||||||
|
// -------------------------------------------------------------------------
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Record1<Integer> key() {
|
||||||
|
return (Record1) super.key();
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------------
|
||||||
|
// Constructors
|
||||||
|
// -------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a detached BookauthorRecord
|
||||||
|
*/
|
||||||
|
public BookauthorRecord() {
|
||||||
|
super(Bookauthor.BOOKAUTHOR);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a detached, initialised BookauthorRecord
|
||||||
|
*/
|
||||||
|
public BookauthorRecord(Integer id, String name, String country) {
|
||||||
|
super(Bookauthor.BOOKAUTHOR);
|
||||||
|
|
||||||
|
setId(id);
|
||||||
|
setName(name);
|
||||||
|
setCountry(country);
|
||||||
|
resetChangedOnNotNull();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,79 @@
|
|||||||
|
/*
|
||||||
|
* This file is generated by jOOQ.
|
||||||
|
*/
|
||||||
|
package com.baeldung.jooq.jointables.public_.tables.records;
|
||||||
|
|
||||||
|
|
||||||
|
import com.baeldung.jooq.jointables.public_.tables.Store;
|
||||||
|
|
||||||
|
import org.jooq.Record1;
|
||||||
|
import org.jooq.impl.UpdatableRecordImpl;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class is generated by jOOQ.
|
||||||
|
*/
|
||||||
|
@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" })
|
||||||
|
public class StoreRecord extends UpdatableRecordImpl<StoreRecord> {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Setter for <code>public.Store.id</code>.
|
||||||
|
*/
|
||||||
|
public void setId(Integer value) {
|
||||||
|
set(0, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Getter for <code>public.Store.id</code>.
|
||||||
|
*/
|
||||||
|
public Integer getId() {
|
||||||
|
return (Integer) get(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Setter for <code>public.Store.name</code>.
|
||||||
|
*/
|
||||||
|
public void setName(String value) {
|
||||||
|
set(1, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Getter for <code>public.Store.name</code>.
|
||||||
|
*/
|
||||||
|
public String getName() {
|
||||||
|
return (String) get(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------------
|
||||||
|
// Primary key information
|
||||||
|
// -------------------------------------------------------------------------
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Record1<Integer> key() {
|
||||||
|
return (Record1) super.key();
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------------
|
||||||
|
// Constructors
|
||||||
|
// -------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a detached StoreRecord
|
||||||
|
*/
|
||||||
|
public StoreRecord() {
|
||||||
|
super(Store.STORE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a detached, initialised StoreRecord
|
||||||
|
*/
|
||||||
|
public StoreRecord(Integer id, String name) {
|
||||||
|
super(Store.STORE);
|
||||||
|
|
||||||
|
setId(id);
|
||||||
|
setName(name);
|
||||||
|
resetChangedOnNotNull();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,111 @@
|
|||||||
|
package com.baeldung.jooq.jointables;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertNotNull;
|
||||||
|
|
||||||
|
import java.sql.Connection;
|
||||||
|
import java.sql.DriverManager;
|
||||||
|
|
||||||
|
import org.jooq.DSLContext;
|
||||||
|
import org.jooq.Record;
|
||||||
|
import org.jooq.Result;
|
||||||
|
import org.jooq.SQLDialect;
|
||||||
|
import org.jooq.impl.DSL;
|
||||||
|
import org.junit.AfterClass;
|
||||||
|
import org.junit.BeforeClass;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import com.baeldung.jooq.jointables.public_.Tables;
|
||||||
|
import com.baeldung.jooq.jointables.public_.tables.Book;
|
||||||
|
import com.baeldung.jooq.jointables.public_.tables.Bookauthor;
|
||||||
|
import com.baeldung.jooq.jointables.public_.tables.Store;
|
||||||
|
|
||||||
|
public class JoinTablesIntegrationTest {
|
||||||
|
|
||||||
|
static DSLContext context;
|
||||||
|
|
||||||
|
@BeforeClass
|
||||||
|
public static void setUp() throws Exception {
|
||||||
|
// URL jooqConfigURL = getClass().getClassLoader().getResource("jooq-config-2.xml");
|
||||||
|
// File file = new File(jooqConfigURL.getFile());
|
||||||
|
// GenerationTool.generate(Files.readString(file.toPath()));
|
||||||
|
|
||||||
|
String url = "jdbc:postgresql://localhost:5432/postgres";
|
||||||
|
String username = "postgres";
|
||||||
|
String password = "";
|
||||||
|
|
||||||
|
Connection conn = DriverManager.getConnection(url, username, password);
|
||||||
|
context = DSL.using(conn, SQLDialect.POSTGRES);
|
||||||
|
|
||||||
|
context.insertInto(Tables.STORE, Store.STORE.ID, Store.STORE.NAME)
|
||||||
|
.values(1, "ABC Branch I ")
|
||||||
|
.values(2, "ABC Branch II")
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
context.insertInto(Tables.BOOK, Book.BOOK.ID, Book.BOOK.TITLE, Book.BOOK.DESCRIPTION, Book.BOOK.AUTHOR_ID, Book.BOOK.STORE_ID)
|
||||||
|
.values(1, "Book 1", "This is book 1", 1, 1)
|
||||||
|
.values(2, "Book 2", "This is book 2", 2, 2)
|
||||||
|
.values(3, "Book 3", "This is book 3", 1, 2)
|
||||||
|
.values(4, "Book 4", "This is book 4", 5, 1)
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
context.insertInto(Tables.BOOKAUTHOR, Bookauthor.BOOKAUTHOR.ID, Bookauthor.BOOKAUTHOR.NAME, Bookauthor.BOOKAUTHOR.COUNTRY)
|
||||||
|
.values(1, "John Smith", "Japan")
|
||||||
|
.values(2, "William Walce", "Japan")
|
||||||
|
.values(3, "Marry Sity", "South Korea")
|
||||||
|
.values(4, "Morry Toh", "England")
|
||||||
|
.execute();
|
||||||
|
}
|
||||||
|
|
||||||
|
@AfterClass
|
||||||
|
public static void cleanup() throws Exception {
|
||||||
|
context.truncateTable(Store.STORE)
|
||||||
|
.execute();
|
||||||
|
context.truncateTable(Book.BOOK)
|
||||||
|
.execute();
|
||||||
|
context.truncateTable(Bookauthor.BOOKAUTHOR)
|
||||||
|
.execute();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void _whenUsingJoinMethod_thenQueryExecuted() {
|
||||||
|
Result<Record> result = JoinTables.usingJoinMethod(context);
|
||||||
|
assertEquals(3, result.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void _whenUsingMultipleJoinMethod_thenQueryExecuted() {
|
||||||
|
Result<Record> result = JoinTables.usingMultipleJoinMethod(context);
|
||||||
|
assertEquals(3, result.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenContext_whenUsingLeftOuterJoinMethod_thenQueryExecuted() {
|
||||||
|
Result<Record> result = JoinTables.usingLeftOuterJoinMethod(context);
|
||||||
|
assertEquals(4, result.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenUsingRightOuterJoinMethod_thenQueryExecuted() {
|
||||||
|
Result<Record> result = JoinTables.usingRightOuterJoinMethod(context);
|
||||||
|
assertEquals(5, result.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenUsingFullOuterJoinMethod_thenQueryExecuted() {
|
||||||
|
Result<Record> result = JoinTables.usingFullOuterJoinMethod(context);
|
||||||
|
assertEquals(6, result.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenUsingNaturalJoinMethod_thenQueryExecuted() {
|
||||||
|
Result<Record> result = JoinTables.usingNaturalJoinMethod(context);
|
||||||
|
assertEquals(4, result.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenUsingCrossJoinMethod_thenQueryExecuted() {
|
||||||
|
Result<Record> result = JoinTables.usingCrossJoinMethod(context);
|
||||||
|
assertEquals(8, result.size());
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,19 @@
|
|||||||
|
<configuration xmlns="http://www.jooq.org/xsd/jooq-codegen-3.15.0.xsd">
|
||||||
|
<jdbc>
|
||||||
|
<driver>org.postgresql.Driver</driver>
|
||||||
|
<url>jdbc:postgresql://localhost:5432/postgres</url>
|
||||||
|
<user>postgres</user>
|
||||||
|
<password></password>
|
||||||
|
</jdbc>
|
||||||
|
<generator>
|
||||||
|
<database>
|
||||||
|
<name>org.jooq.meta.postgres.PostgresDatabase</name>
|
||||||
|
<includes>Store|Book|BookAuthor</includes>
|
||||||
|
<excludes></excludes>
|
||||||
|
</database>
|
||||||
|
<target>
|
||||||
|
<packageName>com.baeldung.jooq.jointables</packageName>
|
||||||
|
<directory>src/main/java</directory>
|
||||||
|
</target>
|
||||||
|
</generator>
|
||||||
|
</configuration>
|
@ -88,6 +88,7 @@
|
|||||||
<module>spring-data-jpa-query</module>
|
<module>spring-data-jpa-query</module>
|
||||||
<module>spring-data-jpa-query-2</module>
|
<module>spring-data-jpa-query-2</module>
|
||||||
<module>spring-data-jpa-query-3</module>
|
<module>spring-data-jpa-query-3</module>
|
||||||
|
<module>spring-data-jpa-query-4</module>
|
||||||
<module>spring-data-jpa-repo</module>
|
<module>spring-data-jpa-repo</module>
|
||||||
<module>spring-data-jpa-repo-2</module>
|
<module>spring-data-jpa-repo-2</module>
|
||||||
<module>spring-data-jpa-repo-4</module>
|
<module>spring-data-jpa-repo-4</module>
|
||||||
@ -107,6 +108,7 @@
|
|||||||
<module>spring-hibernate-6</module>
|
<module>spring-hibernate-6</module>
|
||||||
<module>spring-jpa</module>
|
<module>spring-jpa</module>
|
||||||
<module>spring-jpa-2</module>
|
<module>spring-jpa-2</module>
|
||||||
|
<module>spring-jpa-3</module>
|
||||||
<module>spring-jdbc</module>
|
<module>spring-jdbc</module>
|
||||||
<module>spring-jdbc-2</module>
|
<module>spring-jdbc-2</module>
|
||||||
<!--<module>spring-jooq</module>-->
|
<!--<module>spring-jooq</module>-->
|
||||||
|
45
persistence-modules/spring-data-jpa-query-4/pom.xml
Normal file
45
persistence-modules/spring-data-jpa-query-4/pom.xml
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
<?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>
|
||||||
|
<artifactId>spring-data-jpa-query-4</artifactId>
|
||||||
|
<name>spring-data-jpa-query-4</name>
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<groupId>com.baeldung</groupId>
|
||||||
|
<artifactId>parent-boot-2</artifactId>
|
||||||
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
|
<relativePath>../../parent-boot-2</relativePath>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-web</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-data-jpa</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-test</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.h2database</groupId>
|
||||||
|
<artifactId>h2</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.postgresql</groupId>
|
||||||
|
<artifactId>postgresql</artifactId>
|
||||||
|
<version>${postgresql.version}</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<postgresql.version>42.7.1</postgresql.version>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
</project>
|
@ -0,0 +1,52 @@
|
|||||||
|
package com.baeldung.spring.data.jpa.queryjsonb;
|
||||||
|
|
||||||
|
import javax.persistence.Column;
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.GeneratedValue;
|
||||||
|
import javax.persistence.GenerationType;
|
||||||
|
import javax.persistence.Id;
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
public class Product {
|
||||||
|
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
private String name;
|
||||||
|
@Column(columnDefinition = "jsonb")
|
||||||
|
private String attributes;
|
||||||
|
|
||||||
|
public Product() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public Product(String name, String attributes) {
|
||||||
|
this.name = name;
|
||||||
|
this.attributes = attributes;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(Long id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAttributes() {
|
||||||
|
return attributes;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAttributes(String attributes) {
|
||||||
|
this.attributes = attributes;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
package com.baeldung.spring.data.jpa.queryjsonb;
|
||||||
|
|
||||||
|
import org.springframework.boot.SpringApplication;
|
||||||
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
|
|
||||||
|
@SpringBootApplication
|
||||||
|
public class ProductApplication {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
SpringApplication.run(ProductApplication.class);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,24 @@
|
|||||||
|
package com.baeldung.spring.data.jpa.queryjsonb;
|
||||||
|
|
||||||
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
|
||||||
|
import org.springframework.data.jpa.repository.Query;
|
||||||
|
import org.springframework.data.repository.query.Param;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public interface ProductRepository extends JpaRepository<Product, Long>, JpaSpecificationExecutor<Product> {
|
||||||
|
@Query(value = "SELECT * FROM product WHERE attributes ->> ?1 = ?2", nativeQuery = true)
|
||||||
|
List<Product> findByAttribute(String key, String value);
|
||||||
|
|
||||||
|
@Query(value = "SELECT * FROM product WHERE attributes -> ?1 ->> ?2 = ?3", nativeQuery = true)
|
||||||
|
List<Product> findByNestedAttribute(String key1, String key2, String value);
|
||||||
|
|
||||||
|
@Query(value = "SELECT * FROM product WHERE jsonb_extract_path_text(attributes, ?1) = ?2", nativeQuery = true)
|
||||||
|
List<Product> findByJsonPath(String path, String value);
|
||||||
|
|
||||||
|
@Query(value = "SELECT * FROM product WHERE jsonb_extract_path_text(attributes, ?1, ?2) = ?3", nativeQuery = true)
|
||||||
|
List<Product> findByNestedJsonPath(String key1, String key2, String value);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
package com.baeldung.spring.data.jpa.queryjsonb;
|
||||||
|
|
||||||
|
import javax.persistence.criteria.CriteriaBuilder;
|
||||||
|
import javax.persistence.criteria.CriteriaQuery;
|
||||||
|
import javax.persistence.criteria.Predicate;
|
||||||
|
import javax.persistence.criteria.Root;
|
||||||
|
|
||||||
|
import org.springframework.data.jpa.domain.Specification;
|
||||||
|
public class ProductSpecification implements Specification<Product> {
|
||||||
|
|
||||||
|
private final String key;
|
||||||
|
private final String value;
|
||||||
|
|
||||||
|
public ProductSpecification(String key, String value) {
|
||||||
|
this.key = key; this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Predicate toPredicate(Root<Product> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
|
||||||
|
return cb.equal(cb.function("jsonb_extract_path_text", String.class, root.get("attributes"), cb.literal(key)), value);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,10 @@
|
|||||||
|
spring.datasource.url=jdbc:postgresql://localhost:5432/postgres
|
||||||
|
spring.datasource.username=postgres
|
||||||
|
spring.datasource.password=
|
||||||
|
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
|
||||||
|
spring.jpa.hibernate.ddl-auto=create
|
||||||
|
spring.jpa.show-sql=true
|
||||||
|
|
||||||
|
logging.level.org.hibernate.SQL=DEBUG
|
||||||
|
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
|
||||||
|
spring.jpa.properties.hibernate.format_sql=true
|
@ -0,0 +1,77 @@
|
|||||||
|
package com.baeldung.spring.data.jpa.queryjsonb;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import javax.transaction.Transactional;
|
||||||
|
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.boot.test.context.SpringBootTest;
|
||||||
|
import org.springframework.boot.test.mock.mockito.MockBean;
|
||||||
|
import org.springframework.data.domain.PageImpl;
|
||||||
|
import org.springframework.test.annotation.Commit;
|
||||||
|
import org.springframework.test.context.ActiveProfiles;
|
||||||
|
import org.springframework.data.domain.Page;
|
||||||
|
import org.springframework.data.domain.Pageable;
|
||||||
|
import org.springframework.test.context.jdbc.Sql;
|
||||||
|
import org.springframework.transaction.annotation.Propagation;
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
|
||||||
|
@SpringBootTest
|
||||||
|
@ActiveProfiles("test")
|
||||||
|
@Sql(scripts = "/testdata.sql", executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD)
|
||||||
|
public class ProductRepositoryIntegrationTest {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ProductRepository productRepository;
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void whenFindByAttribute_thenReturnTheObject() {
|
||||||
|
List<Product> redProducts = productRepository.findByAttribute("color", "red");
|
||||||
|
|
||||||
|
assertEquals(1, redProducts.size());
|
||||||
|
assertEquals("Laptop", redProducts.get(0).getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void whenFindByNestedAttribute_thenReturnTheObject() {
|
||||||
|
List<Product> electronicProducts = productRepository.findByNestedAttribute("details", "category", "electronics");
|
||||||
|
|
||||||
|
assertEquals(1, electronicProducts.size());
|
||||||
|
assertEquals("Headphones", electronicProducts.get(0)
|
||||||
|
.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void whenFindByJsonPath_thenReturnTheObject() {
|
||||||
|
List<Product> redProducts = productRepository.findByJsonPath("color", "red");
|
||||||
|
assertEquals(1, redProducts.size());
|
||||||
|
assertEquals("Laptop", redProducts.get(0)
|
||||||
|
.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenNestedJsonAttribute_whenFindByJsonPath_thenReturnTheObject() {
|
||||||
|
List<Product> electronicProducts = productRepository.findByNestedJsonPath("details", "category", "electronics");
|
||||||
|
assertEquals(1, electronicProducts.size());
|
||||||
|
assertEquals("Headphones", electronicProducts.get(0)
|
||||||
|
.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void whenUsingJPASpecification_thenReturnTheObject() {
|
||||||
|
ProductSpecification spec = new ProductSpecification("color", "red");
|
||||||
|
Page<Product> redProducts = productRepository.findAll(spec, Pageable.unpaged());
|
||||||
|
|
||||||
|
assertEquals(1, redProducts.getContent()
|
||||||
|
.size());
|
||||||
|
assertEquals("Laptop", redProducts.getContent()
|
||||||
|
.get(0)
|
||||||
|
.getName());
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,10 @@
|
|||||||
|
spring.datasource.url=jdbc:postgresql://localhost:5432/postgres
|
||||||
|
spring.datasource.username=postgres
|
||||||
|
spring.datasource.password=
|
||||||
|
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
|
||||||
|
spring.jpa.hibernate.ddl-auto=create
|
||||||
|
spring.jpa.show-sql=true
|
||||||
|
spring.jpa.properties.hibernate.format_sql=true
|
||||||
|
|
||||||
|
logging.level.org.hibernate.SQL=DEBUG
|
||||||
|
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
|
@ -0,0 +1,13 @@
|
|||||||
|
DELETE FROM product;
|
||||||
|
|
||||||
|
INSERT INTO product (name, attributes)
|
||||||
|
VALUES ('Laptop', '{"color": "red", "size": "15 inch"}');
|
||||||
|
|
||||||
|
INSERT INTO product (name, attributes)
|
||||||
|
VALUES ('Phone', '{"color": "blue", "size": "6 inch"}');
|
||||||
|
|
||||||
|
INSERT INTO product (name, attributes)
|
||||||
|
VALUES ('Headphones', '{"brand": "Sony", "details": {"category": "electronics", "model": "WH-1000XM4"}}');
|
||||||
|
|
||||||
|
INSERT INTO product (name, attributes)
|
||||||
|
VALUES ('Laptop', '{"brand": "Dell", "details": {"category": "computers", "model": "XPS 13"}}');
|
@ -0,0 +1,52 @@
|
|||||||
|
package com.baeldung.spring.data.jpa.joinquery;
|
||||||
|
|
||||||
|
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
|
||||||
|
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
|
||||||
|
import org.springframework.orm.jpa.JpaTransactionManager;
|
||||||
|
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
|
||||||
|
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
|
||||||
|
|
||||||
|
import javax.sql.DataSource;
|
||||||
|
import java.util.Properties;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
@EnableAutoConfiguration
|
||||||
|
public class AppConfig {
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public DataSource dataSource() {
|
||||||
|
return new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2)
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) {
|
||||||
|
LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
|
||||||
|
emf.setDataSource(dataSource);
|
||||||
|
emf.setPackagesToScan("com.baeldung.spring.data.jpa.joinquery.entities"
|
||||||
|
, "com.baeldung.spring.data.jpa.joinquery.DTO"
|
||||||
|
, "com.baeldung.spring.data.jpa.joinquery.repositories");
|
||||||
|
emf.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
|
||||||
|
emf.setJpaProperties(getHibernateProperties());
|
||||||
|
return emf;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public JpaTransactionManager transactionManager(LocalContainerEntityManagerFactoryBean entityManagerFactory) {
|
||||||
|
return new JpaTransactionManager(entityManagerFactory.getObject());
|
||||||
|
}
|
||||||
|
|
||||||
|
private Properties getHibernateProperties() {
|
||||||
|
Properties properties = new Properties();
|
||||||
|
properties.setProperty("hibernate.hbm2ddl.auto", "create");
|
||||||
|
properties.setProperty("hibernate.dialect", "org.hibernate.dialect.H2Dialect");
|
||||||
|
return properties;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,119 @@
|
|||||||
|
package com.baeldung.spring.data.jpa.joinquery.DTO;
|
||||||
|
|
||||||
|
import jakarta.persistence.Entity;
|
||||||
|
import jakarta.persistence.Id;
|
||||||
|
import jakarta.persistence.IdClass;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
|
||||||
|
import java.time.LocalDate;
|
||||||
|
|
||||||
|
class DTO {
|
||||||
|
private Long customer_id;
|
||||||
|
private Long order_id;
|
||||||
|
private Long product_id;
|
||||||
|
|
||||||
|
public DTO(Long customer_id, Long order_id, Long product_id) {
|
||||||
|
this.customer_id = customer_id;
|
||||||
|
this.order_id = order_id;
|
||||||
|
this.product_id = product_id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@IdClass(DTO.class)
|
||||||
|
public class ResultDTO {
|
||||||
|
@Id
|
||||||
|
private Long customer_id;
|
||||||
|
|
||||||
|
@Id
|
||||||
|
private Long order_id;
|
||||||
|
|
||||||
|
@Id
|
||||||
|
private Long product_id;
|
||||||
|
|
||||||
|
public void setCustomer_id(Long customer_id) {
|
||||||
|
this.customer_id = customer_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getProduct_id() {
|
||||||
|
return product_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setProduct_id(Long product_id) {
|
||||||
|
this.product_id = product_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ResultDTO(Long customer_id, Long order_id, Long product_id, String customerName, String customerEmail, LocalDate orderDate, String productName, Double productPrice) {
|
||||||
|
this.customer_id = customer_id;
|
||||||
|
this.order_id = order_id;
|
||||||
|
this.product_id = product_id;
|
||||||
|
this.customerName = customerName;
|
||||||
|
this.customerEmail = customerEmail;
|
||||||
|
this.orderDate = orderDate;
|
||||||
|
this.productName = productName;
|
||||||
|
this.productPrice = productPrice;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String customerName;
|
||||||
|
private String customerEmail;
|
||||||
|
private LocalDate orderDate;
|
||||||
|
private String productName;
|
||||||
|
private Double productPrice;
|
||||||
|
|
||||||
|
public Long getCustomer_id() {
|
||||||
|
return customer_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCustoemr_id(Long custoemr_id) {
|
||||||
|
this.customer_id = custoemr_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCustomerName() {
|
||||||
|
return customerName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCustomerName(String customerName) {
|
||||||
|
this.customerName = customerName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCustomerEmail() {
|
||||||
|
return customerEmail;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCustomerEmail(String customerEmail) {
|
||||||
|
this.customerEmail = customerEmail;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getOrder_id() {
|
||||||
|
return order_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOrder_id(Long order_id) {
|
||||||
|
this.order_id = order_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public LocalDate getOrderDate() {
|
||||||
|
return orderDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOrderDate(LocalDate orderDate) {
|
||||||
|
this.orderDate = orderDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getProductName() {
|
||||||
|
return productName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setProductName(String productName) {
|
||||||
|
this.productName = productName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Double getProductPrice() {
|
||||||
|
return productPrice;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setProductPrice(Double productPrice) {
|
||||||
|
this.productPrice = productPrice;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,66 @@
|
|||||||
|
package com.baeldung.spring.data.jpa.joinquery.DTO;
|
||||||
|
|
||||||
|
import jakarta.persistence.Entity;
|
||||||
|
import jakarta.persistence.Id;
|
||||||
|
import jakarta.persistence.IdClass;
|
||||||
|
|
||||||
|
import java.time.LocalDate;
|
||||||
|
|
||||||
|
//@Entity
|
||||||
|
//@IdClass(DTO.class)
|
||||||
|
public class ResultDTO_wo_Ids {
|
||||||
|
public ResultDTO_wo_Ids(String customerName, String customerEmail, LocalDate orderDate, String productName, Double productPrice) {
|
||||||
|
this.customerName = customerName;
|
||||||
|
this.customerEmail = customerEmail;
|
||||||
|
this.orderDate = orderDate;
|
||||||
|
this.productName = productName;
|
||||||
|
this.productPrice = productPrice;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String customerName;
|
||||||
|
private String customerEmail;
|
||||||
|
private LocalDate orderDate;
|
||||||
|
private String productName;
|
||||||
|
private Double productPrice;
|
||||||
|
|
||||||
|
public String getCustomerName() {
|
||||||
|
return customerName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCustomerName(String customerName) {
|
||||||
|
this.customerName = customerName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCustomerEmail() {
|
||||||
|
return customerEmail;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCustomerEmail(String customerEmail) {
|
||||||
|
this.customerEmail = customerEmail;
|
||||||
|
}
|
||||||
|
|
||||||
|
public LocalDate getOrderDate() {
|
||||||
|
return orderDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOrderDate(LocalDate orderDate) {
|
||||||
|
this.orderDate = orderDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getProductName() {
|
||||||
|
return productName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setProductName(String productName) {
|
||||||
|
this.productName = productName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Double getProductPrice() {
|
||||||
|
return productPrice;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setProductPrice(Double productPrice) {
|
||||||
|
this.productPrice = productPrice;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,104 @@
|
|||||||
|
package com.baeldung.spring.data.jpa.joinquery.entities;
|
||||||
|
|
||||||
|
import jakarta.persistence.*;
|
||||||
|
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
public class Customer {
|
||||||
|
public Customer(){}
|
||||||
|
@Id
|
||||||
|
//@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
@OneToMany(mappedBy = "customer"
|
||||||
|
, cascade = CascadeType.ALL)
|
||||||
|
private Set<CustomerOrder> customerOrders;
|
||||||
|
|
||||||
|
public Customer(Long id, Set<CustomerOrder> customerOrders, String email, LocalDate dob, String name) {
|
||||||
|
this.id = id;
|
||||||
|
this.customerOrders = customerOrders;
|
||||||
|
this.email = email;
|
||||||
|
this.dob = dob;
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(Long id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCustomerOrders(Set<CustomerOrder> customerOrders) {
|
||||||
|
this.customerOrders = customerOrders;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "Patient{" +
|
||||||
|
"id=" + id +
|
||||||
|
", orders=" + customerOrders +
|
||||||
|
", email='" + email + '\'' +
|
||||||
|
", dob=" + dob +
|
||||||
|
", name='" + name + '\'' +
|
||||||
|
'}';
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<CustomerOrder> getOrders() {
|
||||||
|
return customerOrders;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOrders(Set<CustomerOrder> orders) {
|
||||||
|
this.customerOrders = orders;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Column
|
||||||
|
private String email;
|
||||||
|
|
||||||
|
@Column(name = "dob", columnDefinition = "DATE")
|
||||||
|
private LocalDate dob;
|
||||||
|
|
||||||
|
@Column
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
if (this == o) return true;
|
||||||
|
if (o == null || getClass() != o.getClass()) return false;
|
||||||
|
Customer patient = (Customer) o;
|
||||||
|
return Objects.equals(id, patient.id);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Objects.hash(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getEmail() {
|
||||||
|
return email;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEmail(String email) {
|
||||||
|
this.email = email;
|
||||||
|
}
|
||||||
|
|
||||||
|
public LocalDate getDob() {
|
||||||
|
return dob;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDob(LocalDate dob) {
|
||||||
|
this.dob = dob;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,88 @@
|
|||||||
|
package com.baeldung.spring.data.jpa.joinquery.entities;
|
||||||
|
|
||||||
|
import jakarta.persistence.*;
|
||||||
|
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
public class CustomerOrder {
|
||||||
|
public CustomerOrder(){}
|
||||||
|
@Id
|
||||||
|
//@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
public void setId(Long id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<Product> getProducts() {
|
||||||
|
return products;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setProducts(Set<Product> products) {
|
||||||
|
this.products = products;
|
||||||
|
}
|
||||||
|
|
||||||
|
@OneToMany(mappedBy = "customerOrder"
|
||||||
|
, cascade = CascadeType.ALL)
|
||||||
|
private Set<Product> products;
|
||||||
|
|
||||||
|
@Column
|
||||||
|
private LocalDate orderDate;
|
||||||
|
|
||||||
|
public CustomerOrder(Long id, Set<Product> products, LocalDate orderDate, Customer customer) {
|
||||||
|
this.id = id;
|
||||||
|
this.products = products;
|
||||||
|
this.orderDate = orderDate;
|
||||||
|
this.customer = customer;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "Consult{" +
|
||||||
|
"id=" + id +
|
||||||
|
", products=" + products +
|
||||||
|
", orderDate=" + orderDate +
|
||||||
|
", customer=" + customer +
|
||||||
|
'}';
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
if (this == o) return true;
|
||||||
|
if (o == null || getClass() != o.getClass()) return false;
|
||||||
|
CustomerOrder co = (CustomerOrder) o;
|
||||||
|
return Objects.equals(id, co.id);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Objects.hash(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
@ManyToOne(fetch = FetchType.LAZY)
|
||||||
|
@JoinColumn(name="customer_id", nullable = false)
|
||||||
|
private Customer customer;
|
||||||
|
|
||||||
|
public Long getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public LocalDate getOrderDate() {
|
||||||
|
return orderDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOrderDate(LocalDate orderDate) {
|
||||||
|
this.orderDate = orderDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Customer getCustomer() {
|
||||||
|
return customer;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCustomer(Customer customer) {
|
||||||
|
this.customer = customer;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,84 @@
|
|||||||
|
package com.baeldung.spring.data.jpa.joinquery.entities;
|
||||||
|
|
||||||
|
import jakarta.persistence.*;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
public class Product {
|
||||||
|
public Product(){}
|
||||||
|
@Id
|
||||||
|
//@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
public Product(Long id, String productName, Double price, CustomerOrder customerOrder) {
|
||||||
|
this.id = id;
|
||||||
|
this.productName = productName;
|
||||||
|
this.price = price;
|
||||||
|
this.customerOrder = customerOrder;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Column
|
||||||
|
private String productName;
|
||||||
|
|
||||||
|
@Column
|
||||||
|
private Double price;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "Dispense{" +
|
||||||
|
"id=" + id +
|
||||||
|
", productName='" + productName + '\'' +
|
||||||
|
", price=" + price +
|
||||||
|
'}';
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
if (this == o) return true;
|
||||||
|
if (o == null || getClass() != o.getClass()) return false;
|
||||||
|
Product dispense = (Product) o;
|
||||||
|
return Objects.equals(id, dispense.id);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Objects.hash(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(Long id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getProductName() {
|
||||||
|
return productName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setProductName(String productName) {
|
||||||
|
this.productName = productName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Double getPrice() {
|
||||||
|
return price;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPrice(Double price) {
|
||||||
|
this.price = price;
|
||||||
|
}
|
||||||
|
|
||||||
|
public CustomerOrder getCustomerOrder() {
|
||||||
|
return customerOrder;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCustomerOrder(CustomerOrder co) {
|
||||||
|
this.customerOrder = co;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ManyToOne(fetch = FetchType.LAZY)
|
||||||
|
@JoinColumn(name="customerorder_id", nullable = false)
|
||||||
|
private CustomerOrder customerOrder;
|
||||||
|
}
|
@ -0,0 +1,9 @@
|
|||||||
|
package com.baeldung.spring.data.jpa.joinquery.repositories;
|
||||||
|
|
||||||
|
import com.baeldung.spring.data.jpa.joinquery.entities.Customer;
|
||||||
|
import org.springframework.data.repository.CrudRepository;
|
||||||
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
|
@Repository
|
||||||
|
public interface CustomerRepository extends CrudRepository<Customer, Long> {
|
||||||
|
}
|
@ -0,0 +1,34 @@
|
|||||||
|
package com.baeldung.spring.data.jpa.joinquery.repositories;
|
||||||
|
|
||||||
|
import com.baeldung.spring.data.jpa.joinquery.DTO.ResultDTO;
|
||||||
|
import com.baeldung.spring.data.jpa.joinquery.DTO.ResultDTO_wo_Ids;
|
||||||
|
import org.springframework.data.jpa.repository.Query;
|
||||||
|
import org.springframework.data.repository.CrudRepository;
|
||||||
|
import org.springframework.stereotype.Repository;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
@Repository
|
||||||
|
public interface JoinRepository extends CrudRepository<ResultDTO, Long> {
|
||||||
|
@Query(value = "SELECT new com.baeldung.spring.data.jpa.joinquery.DTO.ResultDTO(c.id, o.id, p.id, c.name, c.email, o.orderDate, p.productName, p.price) "
|
||||||
|
+ " from Customer c, CustomerOrder o ,Product p "
|
||||||
|
+ " where c.id=o.customer.id "
|
||||||
|
+ " and o.id=p.customerOrder.id "
|
||||||
|
+ " and c.id=?1 ")
|
||||||
|
List<ResultDTO> findResultDTOByCustomer(Long id);
|
||||||
|
|
||||||
|
@Query(value = "SELECT new com.baeldung.spring.data.jpa.joinquery.DTO.ResultDTO_wo_Ids(c.name, c.email, o.orderDate, p.productName, p.price) "
|
||||||
|
+ " from Customer c, CustomerOrder o ,Product p "
|
||||||
|
+ " where c.id=o.customer.id "
|
||||||
|
+ " and o.id=p.customerOrder.id "
|
||||||
|
+ " and c.id=?1 ")
|
||||||
|
List<ResultDTO_wo_Ids> findResultDTOByCustomerWithoutIds(Long id);
|
||||||
|
|
||||||
|
@Query(value = "SELECT c.*, o.*, p.* "
|
||||||
|
+ " from Customer c, CustomerOrder o ,Product p "
|
||||||
|
+ " where c.id=o.customer_id "
|
||||||
|
+ " and o.id=p.customerOrder_id "
|
||||||
|
+ " and c.id=?1 "
|
||||||
|
, nativeQuery = true)
|
||||||
|
List<Map<String, Object>> findByCustomer(Long id);
|
||||||
|
}
|
@ -0,0 +1,106 @@
|
|||||||
|
package com.baeldung.spring.data.jpa.joinquery;
|
||||||
|
|
||||||
|
import com.baeldung.spring.data.jpa.joinquery.DTO.ResultDTO_wo_Ids;
|
||||||
|
import com.baeldung.spring.data.jpa.joinquery.entities.Customer;
|
||||||
|
import com.baeldung.spring.data.jpa.joinquery.entities.CustomerOrder;
|
||||||
|
import com.baeldung.spring.data.jpa.joinquery.DTO.ResultDTO;
|
||||||
|
import com.baeldung.spring.data.jpa.joinquery.entities.Product;
|
||||||
|
import com.baeldung.spring.data.jpa.joinquery.repositories.CustomerRepository;
|
||||||
|
import jakarta.persistence.EntityManager;
|
||||||
|
import jakarta.persistence.EntityManagerFactory;
|
||||||
|
import jakarta.persistence.EntityTransaction;
|
||||||
|
import jakarta.persistence.PersistenceUnit;
|
||||||
|
import org.junit.jupiter.api.AfterEach;
|
||||||
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.junit.jupiter.api.extension.ExtendWith;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.test.context.ContextConfiguration;
|
||||||
|
import org.springframework.test.context.junit.jupiter.SpringExtension;
|
||||||
|
import com.baeldung.spring.data.jpa.joinquery.repositories.JoinRepository;
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertInstanceOf;
|
||||||
|
|
||||||
|
@ExtendWith(SpringExtension.class)
|
||||||
|
@ContextConfiguration(classes = { AppConfig.class })
|
||||||
|
class JoinRepositoryUnitTest {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
JoinRepository joinRepository;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
CustomerRepository customerRepository;
|
||||||
|
|
||||||
|
@PersistenceUnit
|
||||||
|
EntityManagerFactory entityManagerFactory;
|
||||||
|
|
||||||
|
EntityManager entityManager;
|
||||||
|
|
||||||
|
@BeforeEach
|
||||||
|
void setUp() {
|
||||||
|
customerRepository.deleteAll();
|
||||||
|
entityManager = entityManagerFactory.createEntityManager();
|
||||||
|
Customer c = new Customer(1L, null, "email1@email.com", LocalDate.now(), "Customer");
|
||||||
|
CustomerOrder o1 = new CustomerOrder(1L, null, LocalDate.now(), c);
|
||||||
|
CustomerOrder o2 = new CustomerOrder(2L, null, LocalDate.of(2024,1,1), c);
|
||||||
|
|
||||||
|
Product p1 = new Product(1L,"Product1", 25.20, o1);
|
||||||
|
Product p2 = new Product(2L, "Product2", 26.20, o1);
|
||||||
|
Product p3 = new Product(3L, "Product3", 27.20, o2);
|
||||||
|
|
||||||
|
Set<CustomerOrder> cos01 = new HashSet<>();
|
||||||
|
cos01.add(o1);
|
||||||
|
cos01.add(o2);
|
||||||
|
Set<Product> productsO1 = new HashSet<>();
|
||||||
|
productsO1.add(p1);
|
||||||
|
productsO1.add(p2);
|
||||||
|
Set<Product> productsO2 = new HashSet<>();
|
||||||
|
productsO1.add(p3);
|
||||||
|
|
||||||
|
c.setCustomerOrders(cos01);
|
||||||
|
o1.setProducts(productsO1);
|
||||||
|
o2.setProducts(productsO2);
|
||||||
|
|
||||||
|
EntityTransaction et = getTransaction();
|
||||||
|
entityManager.persist(c);
|
||||||
|
entityManager.flush();
|
||||||
|
et.commit();
|
||||||
|
}
|
||||||
|
|
||||||
|
@AfterEach
|
||||||
|
void tearDown() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void whenFindResultDTOByCustomer_thenReturnResultDTO() {
|
||||||
|
List<ResultDTO> resultDTO = joinRepository.findResultDTOByCustomer(1L);
|
||||||
|
assertInstanceOf(ResultDTO.class, resultDTO.get(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void whenFindByCustomerNativeQuery_thenReturnMapsForObjects() {
|
||||||
|
List<Map<String, Object>> res = joinRepository.findByCustomer(1L);
|
||||||
|
//the map objects in the res List has 9 String keys aka 9 columns corresponding to the columns of customer, customerOrder, product
|
||||||
|
res.forEach(map -> {
|
||||||
|
assertEquals(9, map.keySet().size());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void whenFindResultDTOByCustomerWithoutIds_thenReturnResultDTO() {
|
||||||
|
List<ResultDTO_wo_Ids> resultDTO = joinRepository.findResultDTOByCustomerWithoutIds(1L);
|
||||||
|
assertInstanceOf(ResultDTO_wo_Ids.class, resultDTO.get(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
private EntityTransaction getTransaction() {
|
||||||
|
EntityTransaction transaction = entityManager.getTransaction();
|
||||||
|
transaction.begin();
|
||||||
|
return transaction;
|
||||||
|
}
|
||||||
|
}
|
@ -32,7 +32,7 @@ public class PersistenceConfig {
|
|||||||
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
|
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
|
||||||
final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
|
final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
|
||||||
em.setDataSource(dataSource());
|
em.setDataSource(dataSource());
|
||||||
em.setPackagesToScan("com.baeldung.jpa.simple.entity");
|
em.setPackagesToScan("com.baeldung.jpa.simple.model");
|
||||||
|
|
||||||
final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
|
final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
|
||||||
em.setJpaVendorAdapter(vendorAdapter);
|
em.setJpaVendorAdapter(vendorAdapter);
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
package com.baeldung.jpa.simple.entity;
|
package com.baeldung.jpa.simple.model;
|
||||||
|
|
||||||
import jakarta.persistence.Entity;
|
import jakarta.persistence.Entity;
|
||||||
import jakarta.persistence.GeneratedValue;
|
import jakarta.persistence.GeneratedValue;
|
@ -1,4 +1,4 @@
|
|||||||
package com.baeldung.jpa.simple.entity;
|
package com.baeldung.jpa.simple.model;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
package com.baeldung.jpa.simple.entity;
|
package com.baeldung.jpa.simple.model;
|
||||||
|
|
||||||
import java.time.ZonedDateTime;
|
import java.time.ZonedDateTime;
|
||||||
|
|
@ -5,7 +5,7 @@ import java.util.List;
|
|||||||
import org.springframework.data.repository.ListCrudRepository;
|
import org.springframework.data.repository.ListCrudRepository;
|
||||||
import org.springframework.stereotype.Repository;
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
import com.baeldung.jpa.simple.entity.Book;
|
import com.baeldung.jpa.simple.model.Book;
|
||||||
|
|
||||||
@Repository
|
@Repository
|
||||||
public interface BookListRepository extends ListCrudRepository<Book, Long> {
|
public interface BookListRepository extends ListCrudRepository<Book, Long> {
|
||||||
|
@ -7,7 +7,7 @@ import org.springframework.data.repository.ListCrudRepository;
|
|||||||
import org.springframework.data.repository.PagingAndSortingRepository;
|
import org.springframework.data.repository.PagingAndSortingRepository;
|
||||||
import org.springframework.stereotype.Repository;
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
import com.baeldung.jpa.simple.entity.Book;
|
import com.baeldung.jpa.simple.model.Book;
|
||||||
|
|
||||||
@Repository
|
@Repository
|
||||||
public interface BookPagingAndSortingRepository extends PagingAndSortingRepository<Book, Long>, ListCrudRepository<Book, Long> {
|
public interface BookPagingAndSortingRepository extends PagingAndSortingRepository<Book, Long>, ListCrudRepository<Book, Long> {
|
||||||
|
@ -4,7 +4,7 @@ import org.springframework.data.jpa.repository.JpaRepository;
|
|||||||
import org.springframework.data.jpa.repository.Query;
|
import org.springframework.data.jpa.repository.Query;
|
||||||
import org.springframework.data.repository.query.Param;
|
import org.springframework.data.repository.query.Param;
|
||||||
|
|
||||||
import com.baeldung.jpa.simple.entity.Foo;
|
import com.baeldung.jpa.simple.model.Foo;
|
||||||
|
|
||||||
public interface IFooDAO extends JpaRepository<Foo, Long> {
|
public interface IFooDAO extends JpaRepository<Foo, Long> {
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@ import java.util.List;
|
|||||||
|
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
|
||||||
import com.baeldung.jpa.simple.entity.User;
|
import com.baeldung.jpa.simple.model.User;
|
||||||
|
|
||||||
public interface UserRepository extends JpaRepository<User, Integer>, UserRepositoryCustom {
|
public interface UserRepository extends JpaRepository<User, Integer>, UserRepositoryCustom {
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@ import java.util.List;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
import com.baeldung.jpa.simple.entity.User;
|
import com.baeldung.jpa.simple.model.User;
|
||||||
|
|
||||||
public interface UserRepositoryCustom {
|
public interface UserRepositoryCustom {
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@ import java.util.Set;
|
|||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
import com.baeldung.jpa.simple.entity.User;
|
import com.baeldung.jpa.simple.model.User;
|
||||||
|
|
||||||
import jakarta.persistence.EntityManager;
|
import jakarta.persistence.EntityManager;
|
||||||
import jakarta.persistence.PersistenceContext;
|
import jakarta.persistence.PersistenceContext;
|
||||||
|
@ -3,7 +3,7 @@ package com.baeldung.jpa.simple.service;
|
|||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import com.baeldung.jpa.simple.entity.Foo;
|
import com.baeldung.jpa.simple.model.Foo;
|
||||||
import com.baeldung.jpa.simple.repository.IFooDAO;
|
import com.baeldung.jpa.simple.repository.IFooDAO;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
package com.baeldung.jpa.simple.service;
|
package com.baeldung.jpa.simple.service;
|
||||||
|
|
||||||
import com.baeldung.jpa.simple.entity.Foo;
|
import com.baeldung.jpa.simple.model.Foo;
|
||||||
|
|
||||||
public interface IFooService {
|
public interface IFooService {
|
||||||
Foo create(Foo foo);
|
Foo create(Foo foo);
|
||||||
|
@ -1,14 +1,15 @@
|
|||||||
package com.baeldung.jpa.simple;
|
package com.baeldung.jpa.simple;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.junit.jupiter.api.Assertions;
|
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.boot.test.context.SpringBootTest;
|
import org.springframework.boot.test.context.SpringBootTest;
|
||||||
|
|
||||||
import com.baeldung.jpa.simple.entity.Book;
|
import com.baeldung.jpa.simple.model.Book;
|
||||||
import com.baeldung.jpa.simple.repository.BookListRepository;
|
import com.baeldung.jpa.simple.repository.BookListRepository;
|
||||||
|
|
||||||
@SpringBootTest(classes = JpaApplication.class)
|
@SpringBootTest(classes = JpaApplication.class)
|
||||||
@ -25,6 +26,6 @@ class BookListRepositoryIntegrationTest {
|
|||||||
bookListRepository.saveAll(Arrays.asList(book1, book2, book3));
|
bookListRepository.saveAll(Arrays.asList(book1, book2, book3));
|
||||||
|
|
||||||
List<Book> books = bookListRepository.findBooksByAuthor("John Doe");
|
List<Book> books = bookListRepository.findBooksByAuthor("John Doe");
|
||||||
Assertions.assertEquals(3, books.size());
|
assertEquals(3, books.size());
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,9 +1,11 @@
|
|||||||
package com.baeldung.jpa.simple;
|
package com.baeldung.jpa.simple;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.junit.jupiter.api.Assertions;
|
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.boot.test.context.SpringBootTest;
|
import org.springframework.boot.test.context.SpringBootTest;
|
||||||
@ -11,7 +13,7 @@ import org.springframework.data.domain.PageRequest;
|
|||||||
import org.springframework.data.domain.Pageable;
|
import org.springframework.data.domain.Pageable;
|
||||||
import org.springframework.data.domain.Sort;
|
import org.springframework.data.domain.Sort;
|
||||||
|
|
||||||
import com.baeldung.jpa.simple.entity.Book;
|
import com.baeldung.jpa.simple.model.Book;
|
||||||
import com.baeldung.jpa.simple.repository.BookPagingAndSortingRepository;
|
import com.baeldung.jpa.simple.repository.BookPagingAndSortingRepository;
|
||||||
|
|
||||||
@SpringBootTest
|
@SpringBootTest
|
||||||
@ -29,8 +31,8 @@ class BookPagingAndSortingRepositoryIntegrationTest {
|
|||||||
|
|
||||||
Pageable pageable = PageRequest.of(0, 2, Sort.by("title").descending());
|
Pageable pageable = PageRequest.of(0, 2, Sort.by("title").descending());
|
||||||
List<Book> books = bookPagingAndSortingRepository.findBooksByAuthor("John Miller", pageable);
|
List<Book> books = bookPagingAndSortingRepository.findBooksByAuthor("John Miller", pageable);
|
||||||
Assertions.assertEquals(2, books.size());
|
assertEquals(2, books.size());
|
||||||
Assertions.assertEquals(book3.getId(), books.get(0).getId());
|
assertEquals(book3.getId(), books.get(0).getId());
|
||||||
Assertions.assertEquals(book2.getId(), books.get(1).getId());
|
assertEquals(book2.getId(), books.get(1).getId());
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -10,7 +10,7 @@ import org.springframework.test.annotation.DirtiesContext;
|
|||||||
import org.springframework.test.context.ContextConfiguration;
|
import org.springframework.test.context.ContextConfiguration;
|
||||||
import org.springframework.test.context.junit4.SpringRunner;
|
import org.springframework.test.context.junit4.SpringRunner;
|
||||||
|
|
||||||
import com.baeldung.jpa.simple.entity.Foo;
|
import com.baeldung.jpa.simple.model.Foo;
|
||||||
import com.baeldung.jpa.simple.service.IFooService;
|
import com.baeldung.jpa.simple.service.IFooService;
|
||||||
|
|
||||||
@RunWith(SpringRunner.class)
|
@RunWith(SpringRunner.class)
|
||||||
|
@ -14,7 +14,7 @@ import org.springframework.beans.factory.annotation.Autowired;
|
|||||||
import org.springframework.boot.test.context.SpringBootTest;
|
import org.springframework.boot.test.context.SpringBootTest;
|
||||||
import org.springframework.test.context.junit.jupiter.SpringExtension;
|
import org.springframework.test.context.junit.jupiter.SpringExtension;
|
||||||
|
|
||||||
import com.baeldung.jpa.simple.entity.User;
|
import com.baeldung.jpa.simple.model.User;
|
||||||
import com.baeldung.jpa.simple.repository.UserRepository;
|
import com.baeldung.jpa.simple.repository.UserRepository;
|
||||||
|
|
||||||
@ExtendWith(SpringExtension.class)
|
@ExtendWith(SpringExtension.class)
|
||||||
|
@ -90,7 +90,9 @@
|
|||||||
<cglib.version>3.2.4</cglib.version>
|
<cglib.version>3.2.4</cglib.version>
|
||||||
<nosqlunit.version>0.10.0</nosqlunit.version>
|
<nosqlunit.version>0.10.0</nosqlunit.version>
|
||||||
<embedded-redis.version>0.6</embedded-redis.version>
|
<embedded-redis.version>0.6</embedded-redis.version>
|
||||||
<jedis.version>4.3.2</jedis.version>
|
<jedis.version>5.1.2</jedis.version>
|
||||||
|
<spring-boot.version>3.2.0</spring-boot.version>
|
||||||
|
<junit-jupiter.version>5.10.2</junit-jupiter.version>
|
||||||
<start-class>com.baeldung.spring.data.redis.SpringRedisApplication</start-class>
|
<start-class>com.baeldung.spring.data.redis.SpringRedisApplication</start-class>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
|
13
persistence-modules/spring-jpa-3/.gitignore
vendored
Normal file
13
persistence-modules/spring-jpa-3/.gitignore
vendored
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
*.class
|
||||||
|
|
||||||
|
#folders#
|
||||||
|
/target
|
||||||
|
/neoDb*
|
||||||
|
/data
|
||||||
|
/src/main/webapp/WEB-INF/classes
|
||||||
|
*/META-INF/*
|
||||||
|
|
||||||
|
# Packaged files #
|
||||||
|
*.jar
|
||||||
|
*.war
|
||||||
|
*.ear
|
4
persistence-modules/spring-jpa-3/README.md
Normal file
4
persistence-modules/spring-jpa-3/README.md
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
## Spring JPA (3)
|
||||||
|
|
||||||
|
### Relevant Articles:
|
||||||
|
- More articles: [[<-- prev]](/spring-jpa-2)
|
43
persistence-modules/spring-jpa-3/pom.xml
Normal file
43
persistence-modules/spring-jpa-3/pom.xml
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
<?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>
|
||||||
|
<artifactId>spring-jpa-3</artifactId>
|
||||||
|
<version>0.1-SNAPSHOT</version>
|
||||||
|
<name>spring-jpa-3</name>
|
||||||
|
<packaging>war</packaging>
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<groupId>com.baeldung</groupId>
|
||||||
|
<artifactId>persistence-modules</artifactId>
|
||||||
|
<version>1.0.0-SNAPSHOT</version>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<!-- Spring -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-data-jpa</artifactId>
|
||||||
|
<version>${spring-boot.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.h2database</groupId>
|
||||||
|
<artifactId>h2</artifactId>
|
||||||
|
<version>${h2.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- test scoped -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-test</artifactId>
|
||||||
|
<version>${spring-boot.version}</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<!-- Spring -->
|
||||||
|
<spring-boot.version>3.2.4</spring-boot.version>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
</project>
|
@ -0,0 +1,128 @@
|
|||||||
|
package com.baeldung.continuetransactionafterexception;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Repository;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
import com.baeldung.continuetransactionafterexception.model.InvoiceEntity;
|
||||||
|
|
||||||
|
import jakarta.persistence.EntityManager;
|
||||||
|
import jakarta.persistence.EntityManagerFactory;
|
||||||
|
import jakarta.persistence.EntityTransaction;
|
||||||
|
import jakarta.persistence.PersistenceContext;
|
||||||
|
import jakarta.persistence.Query;
|
||||||
|
import jakarta.persistence.TypedQuery;
|
||||||
|
|
||||||
|
@Repository
|
||||||
|
public class InvoiceRepository {
|
||||||
|
private final Logger logger = LoggerFactory.getLogger(InvoiceRepository.class);
|
||||||
|
@PersistenceContext
|
||||||
|
private EntityManager entityManager;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private EntityManagerFactory entityManagerFactory;
|
||||||
|
|
||||||
|
@Transactional
|
||||||
|
public void saveBatch(List<InvoiceEntity> invoiceEntities) {
|
||||||
|
invoiceEntities.forEach(i -> entityManager.persist(i));
|
||||||
|
try {
|
||||||
|
entityManager.flush();
|
||||||
|
} catch (Exception e) {
|
||||||
|
logger.error("Duplicates detected, save individually", e);
|
||||||
|
|
||||||
|
invoiceEntities.forEach(i -> {
|
||||||
|
try {
|
||||||
|
save(i);
|
||||||
|
} catch (Exception ex) {
|
||||||
|
logger.error("Problem saving individual entity {}", i.getSerialNumber(), ex);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional
|
||||||
|
public void save(InvoiceEntity invoiceEntity) {
|
||||||
|
if (invoiceEntity.getId() == null) {
|
||||||
|
entityManager.persist(invoiceEntity);
|
||||||
|
} else {
|
||||||
|
entityManager.merge(invoiceEntity);
|
||||||
|
}
|
||||||
|
|
||||||
|
entityManager.flush();
|
||||||
|
logger.info("Entity is saved: {}", invoiceEntity.getSerialNumber());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void saveBatchUsingManualTransaction(List<InvoiceEntity> testEntities) {
|
||||||
|
EntityTransaction transaction = null;
|
||||||
|
try (EntityManager em = em()) {
|
||||||
|
transaction = em.getTransaction();
|
||||||
|
transaction.begin();
|
||||||
|
testEntities.forEach(em::persist);
|
||||||
|
try {
|
||||||
|
em.flush();
|
||||||
|
} catch (Exception e) {
|
||||||
|
logger.error("Duplicates detected, save individually", e);
|
||||||
|
transaction.rollback();
|
||||||
|
testEntities.forEach(t -> {
|
||||||
|
EntityTransaction newTransaction = em.getTransaction();
|
||||||
|
try {
|
||||||
|
newTransaction.begin();
|
||||||
|
saveUsingManualTransaction(t, em);
|
||||||
|
} catch (Exception ex) {
|
||||||
|
logger.error("Problem saving individual entity <{}>", t.getSerialNumber(), ex);
|
||||||
|
newTransaction.rollback();
|
||||||
|
} finally {
|
||||||
|
commitTransactionIfNeeded(newTransaction);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
commitTransactionIfNeeded(transaction);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void commitTransactionIfNeeded(EntityTransaction newTransaction) {
|
||||||
|
if (newTransaction != null && newTransaction.isActive()) {
|
||||||
|
if (!newTransaction.getRollbackOnly()) {
|
||||||
|
newTransaction.commit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void saveUsingManualTransaction(InvoiceEntity invoiceEntity, EntityManager em) {
|
||||||
|
if (invoiceEntity.getId() == null) {
|
||||||
|
em.persist(invoiceEntity);
|
||||||
|
} else {
|
||||||
|
em.merge(invoiceEntity);
|
||||||
|
}
|
||||||
|
|
||||||
|
em.flush();
|
||||||
|
logger.info("Entity is saved: {}", invoiceEntity.getSerialNumber());
|
||||||
|
}
|
||||||
|
|
||||||
|
private EntityManager em() {
|
||||||
|
return entityManagerFactory.createEntityManager();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional
|
||||||
|
public void saveBatchOnly(List<InvoiceEntity> testEntities) {
|
||||||
|
testEntities.forEach(entityManager::persist);
|
||||||
|
entityManager.flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<InvoiceEntity> findAll() {
|
||||||
|
TypedQuery<InvoiceEntity> query = entityManager.createQuery("SELECT i From InvoiceEntity i", InvoiceEntity.class);
|
||||||
|
return query.getResultList();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional
|
||||||
|
public void deleteAll() {
|
||||||
|
Query query = entityManager.createQuery("DELETE FROM InvoiceEntity");
|
||||||
|
query.executeUpdate();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,27 @@
|
|||||||
|
package com.baeldung.continuetransactionafterexception;
|
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
import com.baeldung.continuetransactionafterexception.model.InvoiceEntity;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class InvoiceService {
|
||||||
|
@Autowired
|
||||||
|
private InvoiceRepository repository;
|
||||||
|
@Transactional
|
||||||
|
public void saveInvoice(InvoiceEntity invoice) {
|
||||||
|
repository.save(invoice);
|
||||||
|
sendNotification();
|
||||||
|
}
|
||||||
|
@Transactional(noRollbackFor = NotificationSendingException.class)
|
||||||
|
public void saveInvoiceWithoutRollback(InvoiceEntity entity) {
|
||||||
|
repository.save(entity);
|
||||||
|
sendNotification();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void sendNotification() {
|
||||||
|
throw new NotificationSendingException("Notification sending is failed");
|
||||||
|
}
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user