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

时间:2015-09-25 22:39:03

标签: jpa spring-data-jpa jpql

说我有@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 Data JPA存储库,如下所示:

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

和此:

public interface ActivityRatingRepository extends RatingRepository<ActivityRating>
{

}

这一切都很有效,我可以在任何扩展findByUserId()的特定评级存储库上调用RatingRepository。我现在想要在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。如果有必要,我不一定反对更换新版本。

1 个答案:

答案 0 :(得分:3)

如果您将查询拆分为3个部分:开始,实体和查询结束,它会起作用吗?然后,如果它可以工作,在每个接口中定义常量,如

String ENTITY = "ActivityRating";

然后你可以像

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

顺便说一句,没有必要在界面中定义公共修饰符。

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

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