Pur*_*ari 4 java spring h2 spring-data-jpa
我有一个Spring Boot应用程序,其中包含这样的实体(为简洁起见,删除了一些字段):
@Entity
public class Message extends AbstractPersistable<Long> {
@ManyToMany(targetEntity = Tag.class, fetch = FetchType.EAGER)
private Set<Tag> tags;
// getter and setter for tags here
}
Run Code Online (Sandbox Code Playgroud)
Tag 只是带有名称字段的简单实体。
现在,Set<Tag>我的代码中还有一个来自用户的代码。我想查找所有Message在此集合中具有任何标签的。例如,如果我们有以下消息:
ID TAGS
1 1, 2, 3
2 2, 5, 7
3 2, 4, 7
Run Code Online (Sandbox Code Playgroud)
然后,应在给定集合[3, 4]返回消息1和3的情况下进行查询。
我尝试编写此存储库:
public interface MessageRepository extends JpaRepository<Message, Long> {
List<Message> findByTags(Set<Tag> tag);
}
Run Code Online (Sandbox Code Playgroud)
我启用了查询日志记录,并且我的代码生成了一个查询,在这里我对其进行了一些清理。在我尝试的情况下,查询不会产生任何结果,而且我也不知道scalar = array比较在做什么。
SELECT message.id AS id FROM message
LEFT OUTER JOIN message_tags ON message.id = message_tags.message_id
LEFT OUTER JOIN tag ON message_tags.tags_id = tag.id
WHERE tag.id = (1,2,3,4,5) -- this is the input set
Run Code Online (Sandbox Code Playgroud)
根据@AliDehghani的建议,我尝试将方法编写为findByTagsIn(Set<Tag> tag)。这取代了过去=用in在查询中。
我得到了结果,但是还有另一个问题:每个匹配的标签都重复了结果,就像人们可能从查询中猜测的那样。例如,[2, 7]使用上面的示例消息进行搜索将返回消息1,消息2两次和消息3两次。
据我所知,GROUP BY在此处添加某种子句可能会有所帮助。
该预定义的查询方法的关键词似乎不具有任何功能与此相关的任何,所以我觉得我必须用我自己写的@Query或别的东西。
我似乎无法找出一个可行的查询,而且我在H2方面也不是很有经验,所以我真的不想猜测一个查询也可能如何工作。
我不想编写一个方法来查找具有单个标签的所有消息,为每个标签调用它并组合结果,因为这很丑陋,并且由于输入了很多标签,因此非常慢。我应该如何编写查询方法?
列出findByTags(Set tag);
从查询日志中可以看到,此查询方法将仅查找在给定tag参数中标记有所有标记的消息,这不是您想要的。
为了找到被这些标签之一标记的消息,可以使用以下查询方法:
List<Message> findByTagsIn(Set<Tag> tag);
Run Code Online (Sandbox Code Playgroud)
我得到了结果,但是还有另一个问题:对每个匹配的标签重复执行结果,就像从查询中猜到的那样。
为了摆脱这些重复的消息,您只能获取不同的值:
List<Message> findDistinctByTagsIn(Set<Tag> tag);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3897 次 |
| 最近记录: |