2015-09-25 97 views
1

說我有一個@MappedSuperClass這樣的:春數據JPA JPQL查詢父接口

@MappedSuperclass 
public abstract class Rating 
{ 
    @Id 
    private Long id; 

    @Column(name="USER_ID") 
    private Long userId; 

    private int rating; 
    ... 

有了這樣

@Entity 
@Table(name="ACTIVITY_RATING") 
public class ActivityRating extends Rating 
{ 
    private Long activitySpecificData; 
    ... 

具體子實體然後有一個Spring數據JPA存儲庫這樣的:

@NoRepositoryBean 
public interface RatingRepository<R extends Rating> extends JpaRepository<R, ID> 
{ 
    public List<R> findByUserId(Long userId); 
    ... 

這:

public interface ActivityRatingRepository extends RatingRepository<ActivityRating> 
{ 

} 

這一切的偉大工程,我可以調用任何特定的等級庫擴展RatingRepositoryfindByUserId()。我現在想要在RatingRepository中編寫一些所有子接口都可以繼承的JPQL。我只是不知道在查詢中將FROM放在什麼位置(或者甚至可能)。例如:

@Query("SELECT NEW com.foo.RatingCountVo(e.rating, COUNT(e.rating)) FROM ??????? e GROUP BY e.rating") 
public List<RatingCountVo> getRatingCounts(); 

我可以將這個方法添加到每個擴展RatingRepository但一切都將是除了特定的實體名稱完全相同的個體庫。如果我想更改查詢,那麼我必須去所有的子倉庫並單獨更新它們。我真的希望查詢生活在父類中,而不是重複。有什麼辦法可以做到這一點?

我目前使用spring-data-jpa 1.7.2和eclipselink 2.5.2。如有必要,我不一定反對切換到較新的版本。

回答

3

如果您將查詢拆分爲3個部分:開始,實體和查詢結束,它會起作用嗎?比,如果它會工作,在每個接口定義不變喜歡

String ENTITY = "ActivityRating"; 

然後你就可以使用它像

@Query(RatingRepository.QUERY_START + ENTITY + RatingRepository.QUERY_END) 
List<RatingCountVo> getRatingCounts(); 

BTW,沒有必要在接口定義公共修正。

UPDATE:here is described另一種方式:

@Query("SELECT NEW com.foo.RatingCountVo(e.rating, COUNT(e.rating)) FROM #{#entityName} e GROUP BY e.rating 
+0

這肯定的作品,但它確實還意味着其在所有子接口,而不是僅僅有一次父接口中的方法相同。 – dnc253

+0

更新了我的答案 – asm0dey

+0

完美!這正是我所追求的。 – dnc253