【问题标题】:How to join two entities using another common entity in JPA Specification?如何使用 JPA 规范中的另一个通用实体连接两个实体?
【发布时间】:2013-12-12 19:49:17
【问题描述】:

我有一个简单的数据模型,其中包含 3 个元素,Principal(用户),然后是他的设置和配置文件数据。 UserSetting 和 UserProfile 引用了 Principal,但 Principal 没有引用(单向)。

UserProfile ----> Principal <---- UserSettings

以下是实体(仅显示与问题相关的字段):

@Entity
public class Principal {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id;

    private boolean enabled; 
}

@Entity
public class UserProfile {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id;

    @OneToOne(fetch = FetchType.LAZY) 
    private Principal principal;
}

@Entity
public class UserSettings{
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id;

    @OneToOne(fetch = FetchType.LAZY) 
    private Principal principal;

    private boolean isHidden;
}

这是一个连接表并提取所有正确数据的有效 JPA 查询:

@Query( "SELECT DISTINCT(userProfile) " +
    "FROM UserProfile userProfile " +
    "LEFT JOIN FETCH userProfile.principal AS principal " +
    "WHERE principal.enabled = :enabled " +
    "AND principal.id IN ( " +
        "SELECT userSettings.principal.id " +
        "FROM UserSettings userSettings " +
        "WHERE userSettings.isHidden = :hidden)")

有没有办法创建 JPA 规范来执行以下操作(请记住 Principal 没有对 UserSettings 或 UserProfile 的引用):

a) 过滤掉未启用主体的用户配置文件

WHERE principal.enabled = :enabled

b) 过滤掉那些通过用户设置选择隐藏的用户配置文件

AND principal.id IN (
    SELECT userSettings.principal.id
    FROM UserSettings userSettings
    WHERE userSettings.isHidden = :hidden
)

【问题讨论】:

    标签: java hibernate jpa spring-data spring-data-jpa


    【解决方案1】:

    如果我是你,我将在 UserProfileUserSettings 之间创建双向 @OneToOne 关系

    【讨论】:

    • 倾销 - 你这么说很有趣,我实际上正在摆脱双向关系,因为 fetch = FetchType.LAZY 不适用于双向 OneToOne。花了一整天的时间试图弄清楚如何强制它不获取 OneToOne,尝试了 JoinColum、JoinTable、mappedBy,你的名字,除了单向关系之外没有任何效果。目前正在为我的问题破解一个解决方案,这绝对是可行的,我只是不太熟悉 CriteriaBuilder/Specification 查询方式,所以它被证明有点挑战。
    • 嗯,您必须在 J2EE 应用程序服务器之外运行。如果是这样,您必须在您的 JPA 提供程序中启用编织。在 J2EE AS 中默认启用编织。
    • 看看这篇文章,它描述了我遇到的同样的问题:stackoverflow.com/questions/7510131/…
    • 这两个答案很好。只需确保您启用了运行时编织并且一切顺利。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-20
    • 2011-07-16
    • 2012-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多