【问题标题】:JPQL query for left outer join over parent vs inherited objectJPQL查询父对象与继承对象的左外连接
【发布时间】:2016-05-29 02:47:49
【问题描述】:
Entities/Model:

@Inheritance(strategy=InheritanceType.JOINED)
public class UserAccount implements CommonUserAccount {
    @Id
    private Long id;

    private String email;

    @Embedded
    private PersonalInfo personalInfo = new PersonalInfo(); // name/surname - regular stuff

    @ElementCollection
    @CollectionTable(name = "UserAccountTags", joinColumns = @JoinColumn(name = "accountId", nullable = false))
    @Column(name = "tag")
    //@Transient
    private Set<String> tags = new HashSet<String>();

    @ElementCollection
    @CollectionTable(name = "UserAccountRoles", joinColumns = @JoinColumn(name = "accountId", nullable = false))
    @Enumerated(EnumType.STRING)
    @Column(name = "userRole")
    private Set<UserAccountRole> userRoles = new HashSet<UserAccountRole>();

    // regular getters/setters
}

@Entity
@Table
@PrimaryKeyJoinColumn(name = "useraccountid")
public class DemoUserAccount extends UserAccount implements CommonUserAccount {

    @Column
    private String passwordHash;

    @Column
    private Long failedLogins;

    @Column
    @Temporal(TemporalType.TIMESTAMP)
    Date lockedAt;

    // regular getters/setters
}

问题: 是否可以使用 JPQL(对于 JPA2.0)构建查询,该查询将返回连接到父表 - UserAccounts 的 DemoUserAccounts?这样做会假设我也可以过滤标签/用户角色。通常,某些记录不会填写 DemoUserAccount 特定字段。

【问题讨论】:

  • 请尽量将问题减少到绝对最小值。这将引起额外的关注,因为它会更容易复制。例如,尝试使用较少的字段,并且只使用与问题相关的注释。

标签: sql jpa jpa-2.0 jpql


【解决方案1】:

当您从 DemoUserAccount 执行 SELECT 时,您已经有 UserAccount 字段可用于使用它们进行查询。

所以,如果你想通过emailfailedLogins 过滤:

SELECT d FROM DemoUserAccount d WHERE d.email = 'you@you.com' AND d.failedLogins > 3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-25
    • 2012-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-15
    • 1970-01-01
    相关资源
    最近更新 更多