Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
父接口上的Spring数据JPA JPQL查询_Jpa_Spring Data Jpa_Jpql - Fatal编程技术网

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

父接口上的Spring数据JPA JPQL查询,jpa,spring-data-jpa,jpql,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; ... @NoRepositoryBean public interface RatingRepository<

假设我有一个
@MappedSuperClass
,如下所示:

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

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

    private int rating;
    ...
@NoRepositoryBean
public interface RatingRepository<R extends Rating> extends JpaRepository<R, ID>
{
    public List<R> findByUserId(Long userId);
    ...
有这样一个具体的子实体

@Entity
@Table(name="ACTIVITY_RATING")
public class ActivityRating extends Rating
{
    private Long activitySpecificData;
    ...
还有一个Spring数据JPA存储库,如下所示:

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

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

    private int rating;
    ...
@NoRepositoryBean
public interface RatingRepository<R extends Rating> extends JpaRepository<R, ID>
{
    public List<R> findByUserId(Long userId);
    ...
我可以将此方法添加到扩展
RatingRepository
的每个存储库中,但除了特定的实体名称之外,所有内容都完全相同。如果我想更改查询,那么我必须转到所有的子存储库并单独更新它们。我真的希望查询位于父类中,而不是重复。有没有办法做到这一点


我目前正在使用spring数据JPA1.7.2和eclipselink 2.5.2。如果有必要,我不一定反对切换到新版本。

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

String ENTITY = "ActivityRating";
然后你可以像这样使用它

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

这当然有效,但它仍然意味着在所有子接口上使用相同的方法,而不是在父接口上只使用一次。太好了!这正是我想要的。
@Query("SELECT NEW com.foo.RatingCountVo(e.rating, COUNT(e.rating)) FROM #{#entityName} e GROUP BY e.rating