Skip to content

Commit 309eb69

Browse files
committed
自定义sql语句多表连接查询+分页
1 parent 1a1db94 commit 309eb69

File tree

10 files changed

+175
-39
lines changed

10 files changed

+175
-39
lines changed

docs/basis/springboot-jpa.md

-7
Original file line numberDiff line numberDiff line change
@@ -312,13 +312,6 @@ public class PersonRepositoryTest {
312312
personRepository.deleteAll();
313313
}
314314

315-
@Sql(scripts = {"classpath:/init.sql"})
316-
@Test
317-
public void find_person_age_older_than_18() {
318-
List<Person> personList = personRepository.findByAgeGreaterThan(18);
319-
System.out.println(personList.toString());
320-
}
321-
322315
}
323316
```
324317

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package github.snailclimb.jpademo.model.dto;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Builder;
5+
import lombok.Data;
6+
import lombok.NoArgsConstructor;
7+
8+
@Data
9+
@NoArgsConstructor
10+
@Builder(toBuilder = true)
11+
@AllArgsConstructor
12+
public class UserDTO {
13+
private String name;
14+
private int age;
15+
private String companyName;
16+
private String schoolName;
17+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package github.snailclimb.jpademo.model.po;
2+
3+
import lombok.Builder;
4+
import lombok.Data;
5+
import lombok.NoArgsConstructor;
6+
7+
import javax.persistence.Column;
8+
import javax.persistence.Entity;
9+
import javax.persistence.GeneratedValue;
10+
import javax.persistence.GenerationType;
11+
import javax.persistence.Id;
12+
13+
@Entity
14+
@Data
15+
@NoArgsConstructor
16+
public class Company {
17+
@Id
18+
@GeneratedValue(strategy = GenerationType.IDENTITY)
19+
private Long id;
20+
@Column(unique = true)
21+
private String companyName;
22+
private String description;
23+
24+
public Company(String name, String description) {
25+
this.companyName = name;
26+
this.description = description;
27+
}
28+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package github.snailclimb.jpademo.model.po;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Data;
5+
import lombok.NoArgsConstructor;
6+
7+
import javax.persistence.Column;
8+
import javax.persistence.Entity;
9+
import javax.persistence.GeneratedValue;
10+
import javax.persistence.GenerationType;
11+
import javax.persistence.Id;
12+
13+
@Entity
14+
@Data
15+
@NoArgsConstructor
16+
@AllArgsConstructor
17+
public class Person {
18+
@Id
19+
@GeneratedValue(strategy = GenerationType.IDENTITY)
20+
private Long id;
21+
@Column(unique = true)
22+
private String name;
23+
private Integer age;
24+
private Long companyId;
25+
private Long schoolId;
26+
27+
public Person(String name, Integer age, Long companyId) {
28+
this.name = name;
29+
this.age = age;
30+
this.companyId = companyId;
31+
}
32+
}
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
1-
package github.snailclimb.jpademo.entity;
1+
package github.snailclimb.jpademo.model.po;
22

3+
4+
import lombok.AllArgsConstructor;
5+
import lombok.Builder;
36
import lombok.Data;
47
import lombok.NoArgsConstructor;
58

@@ -12,17 +15,12 @@
1215
@Entity
1316
@Data
1417
@NoArgsConstructor
15-
public class Person {
18+
@AllArgsConstructor
19+
public class School {
1620
@Id
1721
@GeneratedValue(strategy = GenerationType.IDENTITY)
1822
private Long id;
1923
@Column(unique = true)
2024
private String name;
21-
private Integer age;
22-
23-
public Person(String name, Integer age) {
24-
this.name = name;
25-
this.age = age;
26-
}
27-
25+
private String description;
2826
}

source-code/basis/jpa-demo/src/main/java/github/snailclimb/jpademo/repository/PersonRepository.java

+22-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package github.snailclimb.jpademo.repository;
22

3-
import github.snailclimb.jpademo.entity.Person;
3+
import github.snailclimb.jpademo.model.po.Person;
4+
import github.snailclimb.jpademo.model.dto.UserDTO;
5+
import org.springframework.data.domain.Page;
6+
import org.springframework.data.domain.Pageable;
47
import org.springframework.data.jpa.repository.JpaRepository;
58
import org.springframework.data.jpa.repository.Modifying;
69
import org.springframework.data.jpa.repository.Query;
@@ -31,4 +34,22 @@ public interface PersonRepository extends JpaRepository<Person, Long> {
3134
@Transactional
3235
@Query("update Person p set p.name = ?1 where p.id = ?2")
3336
void updatePersonNameById(String name, Long id);
37+
38+
/**
39+
* 连表查询
40+
*/
41+
@Query(value = "select new github.snailclimb.jpademo.model.dto.UserDTO(p.name,p.age,c.companyName,s.name) " +
42+
"from Person p left join Company c on p.companyId=c.id " +
43+
"left join School s on p.schoolId=s.id " +
44+
"where p.id=:personId")
45+
Optional<UserDTO> getUserInformation(@Param("personId") Long personId);
46+
47+
@Query(value = "select new github.snailclimb.jpademo.model.dto.UserDTO(p.name,p.age,c.companyName,s.name) " +
48+
"from Person p left join Company c on p.companyId=c.id " +
49+
"left join School s on p.schoolId=s.id ",
50+
countQuery = "select count(p.id) " +
51+
"from Person p left join Company c on p.companyId=c.id " +
52+
"left join School s on p.schoolId=s.id ")
53+
Page<UserDTO> getUserInformationList(Pageable pageable);
54+
3455
}

source-code/basis/jpa-demo/src/main/resources/application.properties

-1
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,3 @@ spring.jpa.hibernate.ddl-auto=create
1212
spring.jpa.open-in-view=false
1313
# 创建的表的 ENGINE 为 InnoDB
1414
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL55Dialect
15-

source-code/basis/jpa-demo/src/test/java/github/snailclimb/jpademo/repository/PersonRepositoryTest.java

+3-13
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
package github.snailclimb.jpademo.repository;
22

3-
import github.snailclimb.jpademo.entity.Person;
3+
import github.snailclimb.jpademo.model.po.Person;
44
import org.junit.Before;
55
import org.junit.Test;
66
import org.junit.runner.RunWith;
77
import org.springframework.beans.factory.annotation.Autowired;
88
import org.springframework.boot.test.context.SpringBootTest;
9-
import org.springframework.test.context.jdbc.Sql;
109
import org.springframework.test.context.junit4.SpringRunner;
1110

1211
import java.util.List;
@@ -30,11 +29,8 @@ public class PersonRepositoryTest {
3029
@Before
3130
public void setUp() {
3231
assertNotNull(personRepository);
33-
Person person = new Person("SnailClimb", 23);
34-
Person savedPerson = personRepository.saveAndFlush(person);// 更新 person 对象的姓名
35-
savedPerson.setName("UpdatedName");
36-
personRepository.save(savedPerson);
37-
32+
Person person = new Person("SnailClimb", 23, 1L);
33+
Person savedPerson = personRepository.saveAndFlush(person);
3834
id = savedPerson.getId();
3935
}
4036

@@ -76,11 +72,5 @@ public void should_get_person_use_custom_query() {
7672
personRepository.deleteAll();
7773
}
7874

79-
@Sql(scripts = {"classpath:/init.sql"})
80-
@Test
81-
public void find_person_age_older_than_18() {
82-
List<Person> personList = personRepository.findByAgeGreaterThan(18);
83-
System.out.println(personList.toString());
84-
}
8575

8676
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package github.snailclimb.jpademo.repository;
2+
3+
import github.snailclimb.jpademo.model.dto.UserDTO;
4+
import github.snailclimb.jpademo.model.po.Person;
5+
import org.junit.Test;
6+
import org.junit.runner.RunWith;
7+
import org.springframework.beans.factory.annotation.Autowired;
8+
import org.springframework.boot.test.context.SpringBootTest;
9+
import org.springframework.data.domain.Page;
10+
import org.springframework.data.domain.PageRequest;
11+
import org.springframework.data.domain.Pageable;
12+
import org.springframework.data.domain.Sort;
13+
import org.springframework.test.context.jdbc.Sql;
14+
import org.springframework.test.context.junit4.SpringRunner;
15+
16+
import java.util.List;
17+
import java.util.Optional;
18+
19+
import static org.junit.Assert.assertEquals;
20+
21+
@SpringBootTest
22+
@RunWith(SpringRunner.class)
23+
public class PersonRepositoryTest2 {
24+
@Autowired
25+
private PersonRepository personRepository;
26+
27+
@Sql(scripts = {"classpath:/init.sql"})
28+
@Test
29+
public void find_person_age_older_than_18() {
30+
List<Person> personList = personRepository.findByAgeGreaterThan(18);
31+
assertEquals(1, personList.size());
32+
}
33+
34+
@Sql(scripts = {"classpath:/init.sql"})
35+
@Test
36+
public void should_get_user_info() {
37+
Optional<UserDTO> userInformation = personRepository.getUserInformation(1L);
38+
System.out.println(userInformation.get().toString());
39+
}
40+
41+
@Sql(scripts = {"classpath:/init.sql"})
42+
@Test
43+
public void should_get_user_info_list() {
44+
PageRequest pageRequest = PageRequest.of(0, 3, Sort.Direction.DESC, "age");
45+
Page<UserDTO> userInformationList = personRepository.getUserInformationList(pageRequest);
46+
//查询结果总数
47+
System.out.println(userInformationList.getTotalElements());// 6
48+
//按照当前分页大小,总页数
49+
System.out.println(userInformationList.getTotalPages());// 2
50+
System.out.println(userInformationList.getContent());
51+
}
52+
}
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
1-
insert into person (name, age) values ("person1","18")
2-
insert into person (name, age) values ("person2","16")
3-
insert into person (name, age) values ("person3","15")
4-
insert into person (name, age) values ("person4","13")
5-
insert into person (name, age) values ("person5","18")
6-
insert into person (name, age) values ("person6","18")
7-
insert into person (name, age) values ("person7","18")
8-
insert into person (name, age) values ("person8","18")
1+
insert into person (name, age,company_id,school_id) values ("person1",18,1,1)
2+
insert into person (name, age,company_id,school_id) values ("person2",18,1,1)
3+
insert into person (name, age,company_id,school_id) values ("person3",15,1,1)
4+
insert into person (name, age,company_id,school_id) values ("person4",18,2,2)
5+
insert into person (name, age,company_id,school_id) values ("person5",16,2,2)
6+
insert into person (name, age,company_id,school_id) values ("person6",19,2,2)
7+
8+
9+
insert into company (company_name, description) values ("tw","tw is good")
10+
insert into company (company_name, description) values ("baidu","baidu is good")
11+
12+
insert into school (name, description) values ("zhongnandaxue","zhongnandaxue is good")
13+
insert into school (name, description) values ("hubeidaxue","hubeidaxue is good")
14+

0 commit comments

Comments
 (0)