【问题标题】:Count of many to many references多对多引用计数
【发布时间】:2018-02-13 18:14:52
【问题描述】:

在创建我的第一个 Spring Boot 应用程序时,我偶然发现了在 Tag 实体中计算多对多引用的问题。

@Entity
public class Tag {
    @Id
    @GeneratedValue
    private long id;
    private String name;
    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "tag_post", joinColumns = @JoinColumn(name = "tag_id"), inverseJoinColumns = @JoinColumn(name = "post_id"))
    private List<Post> posts;
    private long weight;

在 spring 数据存储库中,我想将权重设置为等于给定标签的引用数

@Repository
public interface TagRepository extends JpaRepository<Tag, Long> {
    @Modifying
    @Query("Update Tag t SET t.weight = ( SELECT COUNT() FROM Post p WHERE t IN p.tags )")
    // i want to make above query work
    void updateWeights();

我可以简单地使用 findAll() 遍历所有标签并设置我自己的权重,但这可能不是最佳解决方案。

我应该怎么做才能使这个查询起作用?我感谢任何建议。

(希望我的问题不要因为太琐碎而被删除)

【问题讨论】:

  • “我想让上面的查询工作”。运行查询时会发生什么?

标签: hibernate spring-data-jpa hql


【解决方案1】:

作为解决我的问题(实际上是 JPQL 无能)的方法,我决定创建这样的方法。

@Override
public void updateWeights()
{

    for(Tag tag: tagRepository.findAll())
    {

        tag.setWeight(0);
        tagRepository.save(tag);
    }

    List<Post> posts = postRepository.findAll();

    for(Post post:posts)
    {
        List<Tag> tags = post.getTags();
        for(Tag tag: tags)
        {
            tag.setWeight(tag.getWeight()+1);
            tagRepository.save(tag);
        }

    }

}

【讨论】:

    猜你喜欢
    • 2021-09-25
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 2010-11-11
    相关资源
    最近更新 更多