Spring 父接口上的数据 JPA JPQL 查询

Spring Data JPA JPQL queries on parent interface

假设我有一个 @MappedSuperClass 这样的:

@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>
{

}

这一切都很好,我可以在任何扩展 RatingRepository 的特定评级存储库上调用 findByUserId()。我现在想在 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 的每个单独的存储库,但除了特定的实体名称外,一切都完全相同。如果我想更改查询,则必须转到所有子存储库并单独更新它们。我真的希望查询存在于父 class 中并且不被复制。有什么办法可以做到这一点?

我目前正在使用 spring-data-jpa 1.7.2 和 eclipselink 2.5.2。如果有必要,我不一定反对切换到更新的版本。

如果将查询分成 3 个部分:查询的开始、实体和结束,是否可行?比,如果它会工作,在每个接口中你定义常量像

String ENTITY = "ActivityRating";

然后就可以像

一样使用了
@Query(RatingRepository.QUERY_START + ENTITY + RatingRepository.QUERY_END)
List<RatingCountVo> getRatingCounts();

顺便说一句,不需要在接口中定义public修饰符。

更新:here is described另一种方式:

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