父接口上的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