我的代码结构如下所示。
文章:
@Entity public class NewsArticle{ @Id @GeneratedValue(strategy=GenerationType.AUTO) private Long id; [Other class properties such as title, publisher, publishedDate, etc.] @OneToMany(mappedBy = "article") private Set<UserReadNewsArticle> userReadNewsArticles = new HashSet<>(); [Getters and Setters] }
用户阅读的文章:
@Entity public class UserReadNewsArticle { @Id @GeneratedValue(strategy=GenerationType.AUTO) private Long id; private Long readAccountId; private Long readArticleId; @JsonIgnore @ManyToOne private Account account; @JsonIgnore @ManyToOne private NewsArticle article; [Getters and Setters] }
帐户:
@Entity public class Account { @Id @GeneratedValue(strategy=GenerationType.AUTO) private Long id; [Other class properties] @OneToMany(mappedBy = "account") private Set<UserReadNewsArticle> userReadNewsArticles = new HashSet<>(); [Getters and Setters] }
我想在NewsArticleRepository中使用一种查询方法来获取用户的所有阅读新闻文章。
public interface NewsArticleRepository extends PagingAndSortingRepository<NewsArticle, Long>{ Collection<NewsArticle> findByUserReadNewsArticlesReadAccountId(Long readAccountId); }
这种方法效果很好。但是,我该如何编写Spring Data JPA查询/方法来获取“用户的未读新闻文章”。我尝试过以下。
Collection<NewsArticle> findByUserReadNewsArticlesReadAccountIdNot(Long readAccountId);
这确实返回了由其他用户阅读的文章列表。但是我的 要求是获取所有未读的新闻文章 。我已经阅读过Spring Data JPA文档,但没有想到更轻松的方法。我该如何克服这个问题?还是我做错了什么?
您可以通过将JPQL查询和子查询一起使用来实现结果:
public interface NewsArticleRepository extends PagingAndSortingRepository<NewsArticle, Long> { @Query("SELECT n FROM NewsArticle n WHERE n NOT IN " + "(SELECT ur.article FROM UserReadNewsArticle ur JOIN ur.account a WHERE a.id = :readAccountId)") Collection<NewsArticle> findByUserReadNewsArticlesReadAccountIdNotIn(@Param("readAccountId") Long readAccountId); }
http:// localhost:8080 / newsArticles / search / findByUserReadNewsArticlesReadAccountIdNotIn?readAccountId = 1
因此,首先从当前用户那里获得已阅读的文章,然后将其从整个文章列表中排除。
我认为spring数据无法使您满意,因为绝对需要子查询。如果我错了,有人可以纠正我。