gpt4 book ai didi

jpa - 父接口(interface)上的 Spring Data JPA JPQL 查询

转载 作者:行者123 更新时间:2023-12-05 03:12:42 25 4
gpt4 key购买 nike

假设我有一个像这样的@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>
{

}

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

最佳答案

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

String ENTITY = "ActivityRating";

然后你就可以像这样使用它了

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

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

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

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

关于jpa - 父接口(interface)上的 Spring Data JPA JPQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32791645/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com