在 JPA 中,我如何找到具有属性值的所有类型和具有属性值的 ManyTomany 相关实体?

Posted

技术标签:

【中文标题】在 JPA 中,我如何找到具有属性值的所有类型和具有属性值的 ManyTomany 相关实体?【英文标题】:In JPA, how would I find all of a type that has a property value and a ManyTomany related entity with a property value? 【发布时间】:2017-06-14 15:41:07 【问题描述】:

我想获取所有具有名称为“创建”的操作的侦听器。

我有以下实体(针对这个问题进行了简化):

@Entity
public class Listener

    ...elided...

    @ManyToMany(targetEntity = Action.class, fetch = FetchType.EAGER)
    @JoinTable(
        name = "ListenerActions",
        joinColumns = @JoinColumn( name = "listenerId", referencedColumnName = "id" ),
        inverseJoinColumns = @JoinColumn( name = "actionId", referencedColumnName = "id" )
    )
    List<Action> actions;


@Entity
public class Action

    ...elided...

    private String name;

如何过滤操作列表?我只需要侦听器的“动作”中的一个动作就可以命名为“创建”。

【问题讨论】:

@CássioMazzochiMolin 我不需要加入吗?我见过:SELECT listener FROM Listener listener JOIN listener.actions action WHERE action.name = :name 【参考方案1】:

JPA 2 查询中的路径表达式可以导航到集合值字段,包括一对多或多对多关系,但这必须是路径中的最后一步; JPA 不允许您编写从那里进一步导航的路径表达式。因此,要执行您想要执行的过滤类型,您需要执行连接或创建子查询。 JPA 2.0 规范提供了前者的这个例子:

SELECT DISTINCT o
FROM Order o JOIN o.lineItems l 
WHERE l.product.productType = 'office_supplies'

,有你想要的形式。

将其适应您的架构留作练习。

【讨论】:

以上是关于在 JPA 中,我如何找到具有属性值的所有类型和具有属性值的 ManyTomany 相关实体?的主要内容,如果未能解决你的问题,请参考以下文章

JPA Annotations - 如何检索具有特定列值的所有实体

查找具有数据项属性的所有元素,无论元素类型或数据项值如何

如何获取所有在 tag 属性中具有值的视图?

具有特定值的任何属性的所有元素的 XPath?

如何在 json 序列化时使用 DefaultContractResolver 覆盖具有字符串值的复杂类型属性

使用JPA在Sql中具有不同值的多个语句where子句