2017-11-27 14 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

フィルタリングは、すでにイベントやアドレスに取り組んでいます。そしてQueryDSLにこの述語のようになります。

  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); 

は、どのように私は今ケース名はエピソードに対する人々の集まりで返される最初の2人で構成されたケース名のために第三の述語を追加しますか?明確にするため

UPDATE

DTOのthatsのは、UIビューが "casename" 属性が含まれてバックアップします。

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のために:出力はこのようなものになるだろうしかし、これの正確な定義は、データベースに依存します機能。私たちはビューを持っていたら、我々は単にJPAの@SecondaryTable機能を使用して、エピソードエンティティにcase_nameをマッピングすることができます

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 

: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; 
} 

その後、他のフィールドと同じようにプロパティをフィルタリングして並べ替えます。

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

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

データベース内のすべてのエピソードに対してビューテーブルが作成されていますか? –