说我有@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。如果有必要,我不一定反对更换新版本。
答案 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