2016-05-11 13 views
0

ネイティブクエリーのデータをリストが入ったオブジェクトにマップしたいと思います。JPAネイティブクエリー結果セットデータとリストを繰り返すマッピング

のは、私はそれがこのデータ者および販売からのデータが繰り返されていることを

1 John 123 This Street  100 June 
1 John 456 That Street  100 June 
1 John 789 There Street 100 June 
2 Bill 987 Apple Street 321 April 
2 Bill 654 Banana Street 321 April 
2 Bill 321 Orange Street 321 April 
2 Bill 741 Pear Street  321 April 
3 Mary 951 Oak Ave   195 May 

通知を返す

select p.id, p.name, a.address, a.city, s.salestotal, s.salesmonth 
from person p, address a, sales s where <Joined somehow> 

(それは私が何をしたいの不自然な例です)このクエリがあるとしましょうアドレスはユニークです。

だから私はこのようになりますオブジェクトにマップしたい:人、売上高及び住所は、すべてのマップされたエンティティです

public class PersonSalesAddressSummary{ 

private Person person; 
private Sales sales; 
private List<Address> addresses; 
//getters and setters etc... 

} 

私は3 PersonSalesAddressSummaryのリストですが、私は結果セットのマッピングを設定する方法がわかりません...私はそれが可能だと思いますが、どこから始めるべきかわかりません。この質問を適切にフレーズする方法についての助けさえも役に立ちます。

編集: は私がで終わるしたいオブジェクトの一つが開催する、より明確にする:

PersonSalesAddressSummary 
Person = 1 John 
Sales = 100 June 
List<Address> = 123 This Street, 
       456 That Street, 
       789 There Street 

少なくとも、私はそれは私の知る限りはあなたを知っているよう

+0

、私を修正してください... –

+0

はい、クエリは明確な – JohnL

答えて

0

より明確に願っていますネイティブクエリから親子関係を抽出できません。ネイティブクエリーは、常にオブジェクトまたは多分タプルのいずれかとして生の行を与えますが、それをオブジェクトにマップするのはあなた次第です。

+0

右ですが、私を助けるSqlResultSetMappingすることはできませんこっちで? – JohnL

+0

いいえ私はそうは思わない。列やエンティティはマッピングされますが、リストはマッピングされません。 –

+0

これは残念です。これは少し難しくなるでしょう、ありがとうニコラス – JohnL

1

@Nicholas氏によると、SqlResultSetMappingは列またはエンティティのみをマッピングします。だから、私見、これはあなたのSqlResultSetMappingが

@SqlResultSetMapping(name = "PersonSalesAddressSummaryDTOMapping", 
    classes = @ConstructorResult(
      targetClass = PersonSalesAddressSummary.class, 
      columns = {    
        @ColumnResult(name = "id", type = Integer.class), 
        @ColumnResult(name = "name"), 
        @ColumnResult(name = "address"), 
        @ColumnResult(name = "city"), 
        @ColumnResult(name = "salestotal", type = Integer.class), 
        @ColumnResult(name = "salesmonth"), 
      }) 

そしてPersonSalesAddressSummary DTO、長いと詳細ソースコードのため申し訳ありません

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 
import java.util.Objects; 
import java.util.Optional; 

public class PersonSalesAddressSummary { 

    private static Map<PersonSales, List<Address>> mapPersonSales = new HashMap<>(); 

    private Person person; 
    private Sales sales; 
    private List<Address> addresses; 

    public PersonSalesAddressSummary(Integer id, String name, String address, String city, Integer salestotal, String salesmonth) { 
     Person p = new Person(id, name); 
     Sales s = new Sales(salestotal, salesmonth); 
     PersonSales ps = new PersonSales(p,s); 

     Address a = new Address(address,city); 

     Optional<List<Address>> addressList = Optional.ofNullable(mapPersonSales.get(ps)); 
     if(addressList.isPresent()){ 
      addressList.get().add(a); 
     }else{ 
      List<Address> addresses = new ArrayList<>(); 
      addresses.add(a); 
      mapPersonSales.put(ps, addresses); 
     } 
    } 

    class PersonSales { 
     private Person person; 
     private Sales sales; 

     public PersonSales(Person person, Sales sales) { 
      this.person = person; 
      this.sales = sales; 
     } 

     public Person getPerson() { 
      return person; 
     } 

     public void setPerson(Person person) { 
      this.person = person; 
     } 

     public Sales getSales() { 
      return sales; 
     } 

     public void setSales(Sales sales) { 
      this.sales = sales; 
     } 

     @Override 
     public boolean equals(Object o) { 
      if (this == o) return true; 
      if (o == null || getClass() != o.getClass()) return false; 
      PersonSales that = (PersonSales) o; 
      return Objects.equals(person.getId(), that.getPerson().getId()) 
        && Objects.equals(person.getName(), that.getPerson().getName()) 
        && Objects.equals(sales.getAmount(), that.getSales().getAmount()) 
        && Objects.equals(sales.getMonth(), that.getSales().getMonth()) 
        ; 
     } 

     @Override 
     public int hashCode() { 
      return Objects.hash(person.getId(), person.getName(), sales.getAmount(), sales.getMonth()); 
     } 

     @Override 
     public String toString() { 
      final StringBuilder sb = new StringBuilder("PersonSalesAddressSummary ").append("\n"); 
      sb.append("Person = ").append(person.getId()).append(" ").append(person.getName()).append("\n"); 
      sb.append("Sales = ").append(sales.getAmount()).append(" ").append(sales.getMonth()).append("\n"); 
      return sb.toString(); 
     } 
    } 

    class Person { 

     private Integer id; 
     private String name; 

     public Person(Integer id, String name) { 
      this.id = id; 
      this.name = name; 
     } 

     public Integer getId() { 
      return id; 
     } 

     public void setId(Integer id) { 
      this.id = id; 
     } 

     public String getName() { 
      return name; 
     } 

     public void setName(String name) { 
      this.name = name; 
     } 

     @Override 
     public boolean equals(Object o) { 
      if (this == o) return true; 
      if (o == null || getClass() != o.getClass()) return false; 
      Person person = (Person) o; 
      return Objects.equals(id, person.id) && 
        Objects.equals(name, person.name); 
     } 

     @Override 
     public int hashCode() { 
      return Objects.hash(id, name); 
     } 
    } 

    class Sales { 
     private Integer amount; 
     private String month; 

     public Sales(Integer amount, String month) { 
      this.amount = amount; 
      this.month = month; 
     } 

     public Integer getAmount() { 
      return amount; 
     } 

     public void setAmount(Integer amount) { 
      this.amount = amount; 
     } 

     public String getMonth() { 
      return month; 
     } 

     public void setMonth(String month) { 
      this.month = month; 
     } 

     @Override 
     public boolean equals(Object o) { 
      if (this == o) return true; 
      if (o == null || getClass() != o.getClass()) return false; 
      Sales sales = (Sales) o; 
      return Objects.equals(amount, sales.amount) && 
        Objects.equals(month, sales.month); 
     } 

     @Override 
     public int hashCode() { 
      return Objects.hash(amount, month); 
     } 
    } 

    class Address { 
     private String address; 
     private String city; 

     public Address(String address, String city) { 
      this.address = address; 
      this.city = city; 
     } 

     public String getAddress() { 
      return address; 
     } 

     public void setAddress(String address) { 
      this.address = address; 
     } 

     public String getCity() { 
      return city; 
     } 

     public void setCity(String city) { 
      this.city = city; 
     } 

     @Override 
     public String toString() { 
      final StringBuilder sb = new StringBuilder("Address "); 
      sb.append(" = ").append(address); 
      sb.append(" ").append(city); 
      return sb.toString(); 
     } 
    } 

    public Person getPerson() { 
     return person; 
    } 

    public void setPerson(Person person) { 
     this.person = person; 
    } 

    public Sales getSales() { 
     return sales; 
    } 

    public void setSales(Sales sales) { 
     this.sales = sales; 
    } 

    public List<Address> getAddresses() { 
     return addresses; 
    } 

    public void setAddresses(List<Address> addresses) { 
     this.addresses = addresses; 
    } 

    public static void main(String[] args){ 

     new PersonSalesAddressSummary(1, "John", "123", "This Street",  100, "June"); 
     new PersonSalesAddressSummary(1, "John", "456", "This Street",  100, "June"); 
     new PersonSalesAddressSummary(1, "John", "789", "There Street",  100, "June"); 
     new PersonSalesAddressSummary(2, "Bill", "987", "Apple Street",  321, "April"); 
     new PersonSalesAddressSummary(2, "Bill", "654", "Banana Street", 321, "April"); 
     new PersonSalesAddressSummary(2, "Bill", "321", "Orange Street", 321, "April"); 
     new PersonSalesAddressSummary(2, "Bill", "741", "Pear Street",  321, "April"); 
     new PersonSalesAddressSummary(3, "Mary", "951", "Oak Ave",   195, "May"); 

     mapPersonSales.entrySet().stream().forEach(System.out::println); 
    } 
} 
可能性があなたの特別なマッピングのケースのためのソリューションの周りの仕事の1

です

出力

PersonSalesAddressSummary 
Person = 3 Mary 
Sales = 195 May 
=[Address = 951 Oak Ave] 

PersonSalesAddressSummary 
Person = 2 Bill 
Sales = 321 April 
=[Address = 987 Apple Street, Address = 654 Banana Street, Address = 321 Orange Street, Address = 741 Pear Street] 

PersonSalesAddressSummary 
Person = 1 John 
Sales = 100 June 
=[Address = 123 This Street, Address = 456 This Street, Address = 789 There Street] 

私は間違いを持っ​​ている場合、あなたは私が推測している明確なことを選択したいおかげでたくさん

+0

Nice work @Lam Le。私は –

+0

@ PatBに感謝します、私はより意味のあるためにコンストラクタからdistinctAddressメソッドを抽出する方が良いと思います –

関連する問題