2017-11-27 13 views
0

환경은 Java, Spring-boot, Hibernat, QueryDSL, MySQL입니다.QueryDSL의 쿼리 조건

나는 테이블 구조

에피소드

+----+-------------+-------- 
| id | address_id | eventno 
+----+-------------+-------- 
| 5 |   27 | F123 
| 6 |   30 | F456 
| 7 |   45 | F789 
+----+-------------+-------- 

@Entity 
public class Episode { 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private Long id; 
@NotEmpty 
private String eventno; 
@ManyToOne(cascade = CascadeType.ALL) 
private Address address; 

Episode_Person

+----+--------------+--------------+------------+-----------+ 
| id | episode_role | primary_flag | episode_id | person_id | 
+----+--------------+--------------+------------+-----------+ 
| 19 | Buyer  |    |   5 |   1 | 
| 20 | Subject  |    |   5 |   2 | 
| 23 | Witness  |    |   6 |   3 | 
| 24 | Child  |    |   6 |   4 | 
| 27 | Buyer  |    |   5 |   3 | 
| 63 | Investor  |    |   5 |   4 | 
| 64 | Subject  |    |   7 |   1 | 
| 65 | Subject  |    |   7 |   3 | 

@Entity 
public class EpisodePerson { 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private Long id; 

@ManyToOne 
@Valid 
private Person person; 

@ManyToOne 
private Episode episode; 

사람

이3210
+----+-----------+----------+ 
| id | firstname | surname | 
+----+-----------+----------+ 
| 1 | Clint  | eastwood | 
| 2 | Angelina | joilee | 
| 3 | Brad  | pitt  | 
| 4 | Jennifer | aniston | 

@Entity 
@Table(uniqueConstraints = @UniqueConstraint(columnNames = {"nia"})) 
public class Person { 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private Long id; 
private String surname; 
private String firstname; 
private String gender; 

각 에피소드에는 여러 명이 있습니다. 그리고 조인 테이블은 Episode_Person입니다.

내 UI는 각 열에 필터 데이터 테이블이 있습니다

enter image description here

필터링 이미 이벤트 및 주소에서 작동합니다.

지금의 경우 이름의 처음 두 명으로 구성되는 경우 이름에 대한 3 술어를 추가하는 방법
  BooleanBuilder where = new BooleanBuilder(); 
     if (pagination.getFilterBy().getMapOfFilters().get("eventno")!=null) { 
      where.and(qEpisode.eventno.containsIgnoreCase(pagination.getFilterBy().getMapOfFilters().get("eventno"))); 
     } 
     if (pagination.getFilterBy().getMapOfFilters().get("address")!=null) { 
      where.and(qEpisode.address.formattedAddress.containsIgnoreCase(pagination.getFilterBy().getMapOfFilters().get("address"))); 
     } 
     where.and(qEpisode.creatingUser.eq(user)); 
     List<Episode> e = episodeRepository.findAll(where); 

이 에피소드에 대한 사람들의 컬렉션에 반환 : 그리고 QueryDSL에서이 조건처럼 보인다?

UPDATE

는 설명을 위해 DTO 그게 전부는 UI 뷰는 "casename"속성을 포함 백업합니다. 도메인 개체를 DTO로 변환 될 때 그것은 서비스 계층에서 생성됩니다

episodeDashboard.setNames(episodePersonList.get(0).getPerson().getSurname().toUpperCase() +" & " +episodePersonList.get(1).getPerson().getSurname().toUpperCase()); 
+0

어떤 데이터베이스를 사용하고 있습니까? –

+0

@AlanHay MySQL을 사용하고 있습니다. –

답변

1

을하지 쉽게 데이터베이스에 처리의 일부를 위임하지 않는 한.

case_name 속성을 응용 프로그램 논리의 파생 속성 대신 데이터베이스 계층에 채우게되면 프런트 엔드 코드가 간단 해집니다.

보기를 통해이를 수행 할 수 있습니다. 이 LISTAGG 기능과 같은 Oracle의

episode_summary_vw

+------------+-------------------------+ 
| epsiode_id | case_name    | 
+------------+-------------------------+ 
| 5   |  Eastwood & Joilee| 
| 6   |   Pitt & Aniston| 
| 7   |   Aniston & Pitt| 
+------------+-------------------------+ 

GROUP_CONCAT 당신이 원하는 것이 무엇인가와 MySQL을 위해 : 출력이 같은 것 그러나 이것의 정확한 정의는 데이터베이스에 따라 달라집니다 기능.다음

@Entity 
@Table(name = "episodes") 
@SecondaryTable(name = "episode_summary_vw", primaryKeyJoinColumna = @PrimaryKeyJoinColumn(name="episode_id", reference_column_name="id")) 
public class Episode { 

    @Column(name ="case_name", table = "episode_summary_vw") 
    private String caseName; 
} 

당신은 우리가보기를 일단

CREATE VIEW episode_summary_vw as 
SELECT ep.episode_id, GROUP_CONCAT(p.surname SEPARATOR ' & ') 
FROM episode_person ep 
INNER JOIN person p on p.id = ep.person_id 
GROUP BY ep.episode_id; 
-- todo: needs limit to first 2 records 

그때 우리는 단순히 JPA의 @SecondaryTable 기능을 사용하여 에피소드의 실체에 case_name를 매핑 할 수 있습니다 : MySQL의에서 그때처럼이 보일 것 같아 다른 필드와 마찬가지로 속성을 필터링하고 정렬하십시오.

if (pagination.getFilterBy().getMapOfFilters().get("caseName")!=null) { 

    where.and(qEpisode.caseName.containsIgnoreCase(pagination.getFilterBy(). 
     getMapOfFilters().get("caseName"))); 
} 
+0

데이터베이스의 모든 에피소드에 대한보기 테이블이 생성 되었습니까? –