Skip to content

Commit 0825c94

Browse files
implementation (#17025)
Co-authored-by: technoddy <[email protected]>
1 parent 936a259 commit 0825c94

File tree

5 files changed

+31
-0
lines changed

5 files changed

+31
-0
lines changed

persistence-modules/spring-data-jpa-simple/src/main/java/com/baeldung/jpa/projection/model/Person.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,18 @@
11
package com.baeldung.jpa.projection.model;
22

3+
import com.baeldung.jpa.projection.view.PersonDto;
4+
5+
import jakarta.persistence.ColumnResult;
6+
import jakarta.persistence.ConstructorResult;
37
import jakarta.persistence.Entity;
48
import jakarta.persistence.Id;
9+
import jakarta.persistence.NamedNativeQuery;
510
import jakarta.persistence.OneToOne;
11+
import jakarta.persistence.SqlResultSetMapping;
612

713
@Entity
14+
@NamedNativeQuery(name = "person_native_query_dto", query = "SELECT p.first_name, p.last_name From Person p where p.first_name LIKE :firstNameLike", resultSetMapping = "person_query_dto")
15+
@SqlResultSetMapping(name = "person_query_dto", classes = @ConstructorResult(targetClass = PersonDto.class, columns = { @ColumnResult(name = "first_name", type = String.class), @ColumnResult(name = "last_name", type = String.class), }))
816
public class Person {
917
@Id
1018
private Long id;

persistence-modules/spring-data-jpa-simple/src/main/java/com/baeldung/jpa/projection/repository/PersonRepository.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
package com.baeldung.jpa.projection.repository;
22

3+
import java.util.List;
4+
5+
import org.springframework.data.jpa.repository.Query;
36
import org.springframework.data.repository.Repository;
7+
import org.springframework.data.repository.query.Param;
48

59
import com.baeldung.jpa.projection.model.Person;
610
import com.baeldung.jpa.projection.view.PersonDto;
@@ -12,4 +16,7 @@ public interface PersonRepository extends Repository<Person, Long> {
1216
PersonDto findByFirstName(String firstName);
1317

1418
<T> T findByLastName(String lastName, Class<T> type);
19+
20+
@Query(name = "person_native_query_dto", nativeQuery = true)
21+
List<PersonDto> findByFirstNameLike(@Param("firstNameLike") String firstNameLike);
1522
}

persistence-modules/spring-data-jpa-simple/src/main/java/com/baeldung/jpa/projection/view/PersonDto.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,9 @@ public boolean equals(Object o) {
3131
public int hashCode() {
3232
return Objects.hash(firstName, lastName);
3333
}
34+
35+
@Override
36+
public String toString() {
37+
return "PersonDto{" + "firstName='" + firstName + '\'' + ", lastName='" + lastName + '\'' + '}';
38+
}
3439
}

persistence-modules/spring-data-jpa-simple/src/test/java/com/baeldung/jpa/projection/JpaProjectionIntegrationTest.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
import static org.assertj.core.api.Assertions.assertThat;
44
import static org.springframework.test.context.jdbc.Sql.ExecutionPhase.AFTER_TEST_METHOD;
55

6+
import java.util.Arrays;
7+
import java.util.List;
8+
69
import org.junit.jupiter.api.Test;
710
import org.springframework.beans.factory.annotation.Autowired;
811
import org.springframework.boot.autoconfigure.AutoConfigurationPackage;
@@ -43,6 +46,13 @@ void whenUsingOpenProjections_thenViewWithRequiredPropertiesIsReturned() {
4346
assertThat(personView.getFullName()).isEqualTo("John Doe");
4447
}
4548

49+
@Test
50+
void whenUsingClassBasedProjectionsAndJPANativeQuery_thenDtoWithRequiredPropertiesIsReturned() {
51+
List<PersonDto> personDtos = personRepository.findByFirstNameLike("Jo%");
52+
assertThat(personDtos.size()).isEqualTo(2);
53+
assertThat(personDtos).isEqualTo(Arrays.asList(new PersonDto("John", "Doe"), new PersonDto("Job", "Doe")));
54+
}
55+
4656
@Test
4757
void whenUsingClassBasedProjections_thenDtoWithRequiredPropertiesIsReturned() {
4858
PersonDto personDto = personRepository.findByFirstName("John");
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
INSERT INTO person(id,first_name,last_name) VALUES (1,'John','Doe');
2+
INSERT INTO person(id,first_name,last_name) VALUES (2,'Job','Doe');
23
INSERT INTO address(id,person_id,state,city,street,zip_code) VALUES (1,1,'CA', 'Los Angeles', 'Standford Ave', '90001');

0 commit comments

Comments
 (0)