2014-04-15 48 views
0

我使用spring-data-jpa版本1.5.1.RELEASE。選擇幾個列(DTO)與規範JPA

我的域名:

public class MyDomain{ 
.... 
.... 
private String prop1; 
private String prop2; 
...... 
...... 
} 

我的JPA規範是:

public final class MyDomainSpecs { 

public static Specification<MyDomain> search(final String prop1,final String prop2) { 

    return new Specification<MyDomain>() { 
     public Predicate toPredicate(Root<MyDomain> root, CriteriaQuery<?> query, CriteriaBuilder cb) { 
      // Some tests if prop1 exist ..... 
      Predicate predicate1 = cb.equal(root.get("prop1"), prop1); 
      Predicate predicate2 = cb.equal(root.get("prop2"), prop2); 
      return cb.and(predicate1, predicate2); 
     } 

    }; 
} 

}

我的倉庫:

public interface MyDomainRepository extends JpaRepository<MyDomain, Long>, JpaSpecificationExecutor<MyDomain> { 
List<MyDomain> findAll(Specification<MyDomain> spec); 
} 

所有正在工作。 但我的需要(對於性能數據庫調整)是不返回並從數據庫中選擇MyDomain的所有字段。

我只需要選擇例如樹屬性(prop1,prop2,prop3),理想地在DTO對象中。

我不想將我的List<MyDomain>轉換爲List<MyDto>,因爲我正在調整數據庫請求。

所以,我沒有找到任何方式來做到這一點與spring-data-Jpa和規範。

任何想法?

感謝

回答

0

創建的MyDomain(例如MyDomainSummaryLightMyDomain)的特殊版本,只包含要映射的字段。

基本示例

從優良JPA WikiBook借來的。

假設JPA實體(即域類),如下所示:如果沒有條件(where子句)被定義爲

SELECT ID, F_NAME, L_NAME, SALARY FROM EMPLOYEE 

生成將類似於

@Entity 
@Table(name="EMPLOYEE") 
public class BasicEmployee { 
    @Column(name="ID") 
    private long id;  

    @Column(name="F_NAME") 
    private String firstName; 

    @Column(name="L_NAME") 
    private String lastName; 

    // Any un-mapped field will be automatically mapped as basic and column name defaulted. 
    private BigDecimal salary; 
} 

的SQL查詢。因此,爲了概括基本情況,可以說查詢列的數量等於實體中映射字段的數量。因此,實體的字段越少,SQL查詢中包含的列越少。

您可以使用例如Employee實體。 20字段和BasicEmployee如上只有4個字段。然後爲兩者創建不同的存儲庫或不同的存儲庫方法。

性能考慮

不過,我嚴重懷疑你會看到明顯的性能提升,除非你想省略代表了其他實體的關係等領域。在此處開始調整之前,請記錄當前針對數據庫發出的SQL,然後從該SQL中刪除要忽略的列,再次運行並分析您獲得的內容。

+0

我的問題不是性能,有一個績效審計,在我們的語境表明,我們需要刪除選擇*。爲了您的迴應,您可以提供更多詳細信息,但這並不明確。我需要一個基於Spring-DATA-JPA和規範JPA的解決方案。 – Nabil

+0

'select *'查詢不好,這是真的。然而,我敢打賭,Spring Data JPA和你的JPA提供者(Hibernate,EclipseLink,它永遠都是這樣)創造了這些,這讓我感到非常吃驚。我將爲那些不熟悉JPA的人提供一個例子。 –