【问题标题】:JPA select ignoring OR partJPA选择忽略OR部分
【发布时间】:2015-02-24 17:38:18
【问题描述】:

我有选择查询:

SELECT entity
FROM EnterpriseEventLog entity 
WHERE entity.enterprise.recordId = :recordIdEnterprise     
OR  entity.group.enterprise.recordId = :recordIdEnterprise

但是 JPA 忽略了“entity.enterprise.recordId = :recordIdEnterprise”部分,选择就像没有这样的部分一样工作。如果我删除此“OR entity.group.enterprise.recordId = :recordIdEnterprise”,则选择可以正常工作并提取数据。
我将 mySql 5.5 与 EclipseLink 2.5.1 一起使用
这里是我的课程示例:

@Entity (name = "EnterpriseEventLog")
@Table (name = "ENTERPRISE_EVENT_LOG")
public class EnterpriseEventLogEntity {

  @ManyToOne (fetch = FetchType.LAZY)
  @JoinColumn (name = "RECORD_ID_ENTERPRISE", updatable = false)
  private EnterpriseEntity enterprise;

  @ManyToOne (fetch = FetchType.LAZY)
  @JoinColumn (name = "RECORD_ID_GROUP", updatable = false)
  private GroupEntity group;
}


@Entity (name = "Enterprise")
@Table (name = "ENTERPRISE")
public class EnterpriseEntity extends EntityBase {

  @OneToMany (fetch = FetchType.LAZY, mappedBy = "enterprise", cascade = CascadeType.ALL)
  private List<EnterpriseEventLogEntity> eventLog = new ArrayList<> ();
}


@Entity (name = "Group")
@Table (name = "VGROUP")
public class GroupEntity extends EntityBase {

  @NotNull
  @ManyToOne (fetch = FetchType.LAZY, optional = false)
  @JoinColumn (name = "RECORD_ID_ENTERPRISE", nullable = false, updatable = false)
  private EnterpriseEntity enterprise;

  @OneToMany(fetch = FetchType.LAZY, mappedBy = "group", cascade = CascadeType.ALL)
  private List<EnterpriseEventLogEntity> eventLog = new ArrayList<>();
}


@MappedSuperclass
public class EntityBase {

  @Id
  @NotNull    
  @Column (name = "RECORD_ID", nullable = false)
  private Long recordId;
}

【问题讨论】:

  • 您希望查询选择的实体有一个空组,对吗?提示:entity.group 是一个 inner 连接。

标签: java mysql jpa select eclipselink


【解决方案1】:

正如JB Nizet 在他的评论中所说,问题在于 entity.group 是一个内部连接。
所以正确的查询是:

SELECT entity
FROM EnterpriseEventLog entity LEFT JOIN entity.group group LEFT JOIN entity.enterprise enterprise
WHERE enterprise.recordId = :recordIdEnterprise     
OR  group.enterprise.recordId = :recordIdEnterprise

更多信息在这里:EclipseLink User Guide

【讨论】:

    猜你喜欢
    • 2021-11-16
    • 2017-04-23
    • 2018-12-24
    • 1970-01-01
    • 1970-01-01
    • 2019-02-05
    • 2011-05-26
    • 2011-03-01
    • 1970-01-01
    相关资源
    最近更新 更多