当前位置: 首页 > 面试题库 >

如何通过JPA2查询M:N关系?

江瀚昂
2023-03-14
问题内容

我有一个对象(BlogPost),其中包含元素(标记)的M:N集合。

如何查询对象(BlogPost)中至少一个对象的标签与使用JPA2(hibernate)的一组标签(由用户定义)中的元素匹配。

findBlogPostWithAtLeastOneMatchingTag(Collection<Tag> tags){ ???? }

我的主要问题是,我实际上需要比较两个标签集合:-BlogPost的标签集合。-我搜索的收藏集

我尝试了一下,Select p from Post p where p.tags in(:tags)但是它不起作用,因为我的帖子实体具有多个标签。

那我该怎么办呢?

我的BlogPost实体看起来像这样。它有几个标签。

@Entity
public class BlogPost{

    /** The tags. */
    @ManyToMany()
    @NotNull
    private Set<Tag> tags;

    @NotBlank
    private String content;

    ...
}

解决方案不能是JPQL,JPA-Criteria(非Hibernate-Criteria)也可以。


问题答案:

如果您喜欢JPA Criteria,这是为您提供的解决方案:

List<Integer> myTagsIds = new ArrayList<Integer> ();
myTagsIds.add(1);
myTagsIds.add(2);

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<BlogPost> cq = cb.createQuery(BlogPost.class);
Root<BlogPost> blogPost = cq.from(BlogPost.class);
SetJoin<BlogPost, Tag> tags = blogPost.join(BlogPost_.tags);
Predicate predicate = tags.get(Tag_.id).in(myTagsIds);
cq.distinct(true);
cq.where(predicate);
TypedQuery<BlogPost> tq = em.createQuery(cq);
return tq.getResultList();

此解决方案利用规范的MetaModel类BlogPost_Tag_并且应该由您的JPA实现生成。



 类似资料:
  • 问题内容: 我正在使用hibernate-entitymanager 3.6.4.Final和h2数据库1.3.155 我正在使用H2Dialect。 我在按@ElementCollection中的元素过滤记录时遇到麻烦。这是我的实体 这是我的查询: 这是错误消息: 这很奇怪,因为这里的文档中提供了KEY()和VALUE()函数 我是否缺少某些配置?任何的想法 ? 提前致谢 问题答案: 我有完全一

  • 问题内容: 我想构建一个由Instagram照片驱动的小型“即时图片搜索”应用。就像Google Instant,您可以在其中开始键入内容,并且在键入更多字母时显示/更新结果。 您可以看到由Google图片提供支持的实时演示应用。我知道使用大型引擎(Google,Yahoo!,Bing)是可行的,但我不知道Instagram是否允许这样做。任何熟悉API的人都可以提供帮助吗? 如果无法通过有意义的

  • 问题内容: 我目前正在开发第一个Loopbackjs项目,并且面临着一个看似简单的问题:假设我有一个模型“ Post”和一个模型“ Tag”。帖子具有且属于许多标签。 现在,我需要列出所有带有特定标签的帖子。我只是想不通如何使用Loopback创建查询来实现此目的。我以为它会像这样工作,但不会: 我将不胜感激任何帮助。 问题答案: 对某些相关属性进行过滤并不像应该那么容易。有一个未完成的拉取请求,

  • 问题内容: 我将Ebean与Play 2 Framework结合使用,并得到了两种模型:用户模型和书本模型。用户模型与书籍模型以一对多关系连接。因此,每个用户可以拥有很多书,甚至根本没有书。书籍模型本身也具有属性。现在,我想在用户模型中创建一个查询,该查询仅返回具有某些属性书的用户。例如:一个属性可能是条件,例如new或used。现在,给我所有拥有新状态书籍的用户。是否可以使用Ebean方法创建这

  • 问题内容: 我正在使用R包通过R访问我的PostgreSQL数据库(9.3)。我有一些非常长且较大的sql查询(从raster2pgsql生成的几个MB大。)。 如何在R中以语句形式发送/执行sql查询文件? 正常方式 似乎无法通过来工作。我试图通过读取整个sql文件作为字符向量,但是这也失败了,因为dbSendQuery显然仅支持单个命令? 问题答案: 或仅用于“ SQL”部分,而不是psql命

  • 问题内容: 我正在尝试保存两条记录,然后获得第二条记录。问题在于过滤器似乎无法正常工作。尽管我按名称(“ Andrew W”)进行过滤,但我总是得到“ Joe Citizen”。该计数器还指示2条记录,当它应仅为1条时。这让我发疯。请参阅下面的完整代码。结果打印 问题答案: (第一个)问题是: 返回包含您指定的过滤器的派生查询。您必须存储返回值并持续使用它: 或仅一行: 注意:没有此查询,您执行的