Hibernate 在一对一映射列中获取非null的内容?

Hibernate 在一对一映射列中获取非null的内容?,hibernate,scala,jpa,Hibernate,Scala,Jpa,我在一个表中有一些历史数据,该表链接到另外两个具有一对一关系的表。除此之外,由于它是历史记录,其他两个表中的条目并不总是存在。使用NotFoundAction.IGNORE意味着如果引用的表中没有适当的记录,则mediaInfo和/或fileInfo的值为NULL 所以现在我需要能够按fileInfo.fileName进行排序,结果集只包含引用fileInfo不为null的行。是否有办法使结果集包含所有MigrationHistory行,即使fileInfo通常为null(通过让它返回默认值而不

我在一个表中有一些历史数据,该表链接到另外两个具有一对一关系的表。除此之外,由于它是历史记录,其他两个表中的条目并不总是存在。使用
NotFoundAction.IGNORE
意味着如果引用的表中没有适当的记录,则mediaInfo和/或fileInfo的值为NULL

所以现在我需要能够按fileInfo.fileName进行排序,结果集只包含引用fileInfo不为null的行。是否有办法使结果集包含所有MigrationHistory行,即使fileInfo通常为null(通过让它返回默认值而不是null)?或者有必要做两个选择,一个选择获取fileInfo不为null的所有行,然后第二个选择获取那些为null的行

本例中的查询是一个简单的Hibernate
,来自fileInfo.fileName asc的MigrationHistory order

@Entity
@Table(name = "MigrationHistory")
class MigrationHistory extends Serializable with TableObject with MigrationKeys {
  @Id
  @Column(name = "FileLocationID", nullable = false, insertable = true, updatable = true, length = 19, precision = 0)
  @BeanProperty var fileLocationID: Long = _

  @Id
  @Column(name = "MediaInfoID", nullable = false, insertable = true, updatable = true, length = 19, precision = 0)
  @BeanProperty var mediaInfoID: Long = _

  @Column(name = "priority", nullable = false, insertable = true, updatable = true, length = 5, precision = 0)
  @BeanProperty var priority: Short = _

  @Column(name = "isNewPrimary", nullable = false, insertable = true, updatable = true, length = 1, precision = 0)
  @BeanProperty var isNewPrimary: Boolean = _

  @Column(name = "copyOrMove", nullable = false, insertable = true, updatable = true, length = 1, precision = 0)
  @BeanProperty var copyOrMove: String = _

  @Column(name = "migrationStatus", nullable = false, insertable = true, updatable = true, length = 15, precision = 0)
  @BeanProperty var migrationStatus: String = _

  @Column(name = "insertDate", nullable = false, insertable = true, updatable = true, length = 23, precision = 3)
  @BeanProperty var insertDate: Date = _

  @Column(name = "comment", nullable = true, insertable = true, updatable = true, length = 1000, precision = 0)
  @BeanProperty var comment: String = _

  @OneToOne
  @JoinColumn(name = "MediaInfoID", referencedColumnName = "MediaInfoID", insertable = false, updatable = false, nullable = false)
  var mediaInfo: MediaInfo = _

  @OneToOne(optional = true)
  @JoinColumn(name = "FileLocationID", referencedColumnName = "FileInfoID", insertable = false, updatable = false, nullable = true)
  @NotFound(action = NotFoundAction.IGNORE)
  var fileInfo: FileInfo = _
}

@Entity
@Table(name="FileInfo")
class FileInfo extends Serializable {
  @GeneratedValue
  @Column(name = "FileInfoID", nullable = false, insertable = false, updatable = false, length = 19, precision = 0)
  @Id
  @BeanProperty var id: Long = _

  @Column(name = "fileName", nullable = false, insertable = true, updatable = true, length = 30, precision = 0)
  @BeanProperty var fileName: String = _

  @Column(name = "fileSize", nullable = false, insertable = true, updatable = true, length = 7, precision = 0)
  @BeanProperty var fileSize: Float = _
}

克里斯是对的。我需要的是一个左外连接。以下是有效的查询:

from edu.stsci.aofl.dads.MigrationHistory as mh left outer join mh.fileInfo fi left outer join mh.mediaInfo mi order by fi.fileName asc
这个查询有一个有趣的地方,我猜它是由三个“as”子句引起的,它不是生成一个由一堆MigrationHistory对象组成的结果集,而是生成一个由一堆三元素数组组成的结果集。第一个元素是MigrationHistory对象,其余元素为null


关于这个查询的另一个有趣的事情是,大多数DBMS将null视为可能的最低值。一些DBMS(如Derby)提供了一个选项,使它们成为可能的最高值(先为null,后为null)。MS SQL Server没有。

如果不希望筛选空值,则需要在关系上使用显式外部联接(而不是内部联接)。有很多例子,但是您没有显示您正在使用的查询-是JPQL还是特定于hibernate?