多对多引用计数
Count of many to many references
在创建我的第一个 spring 启动应用程序时,我偶然发现了在标记实体中计算多对多引用的问题。
@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() 遍历所有标签并自行设置权重,但这可能不是最佳解决方案。
我应该怎么做才能使这个查询起作用?我很感激任何建议。
(希望我的问题不会因为太琐碎而被删除)
为了解决我的问题(实际上是 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);
}
}
}
在创建我的第一个 spring 启动应用程序时,我偶然发现了在标记实体中计算多对多引用的问题。
@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() 遍历所有标签并自行设置权重,但这可能不是最佳解决方案。
我应该怎么做才能使这个查询起作用?我很感激任何建议。
(希望我的问题不会因为太琐碎而被删除)
为了解决我的问题(实际上是 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);
}
}
}