当前位置: 首页 > 知识库问答 >
问题:

在一对一映射列中获取 null 以外的内容?

祁凯泽
2023-03-14

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

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

本例中的查询是按 fileInfo.fileName asc 从迁移历史记录顺序进行的简单Hibernate。

@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 = _
}

共有1个答案

阎德业
2023-03-14

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

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对象,其余元素为空。

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

 类似资料:
  • 有两张数据表,其中A表的某个字段的值指向B表的主键。因为A表的任何一条记录只能对应B表的一条且唯一一条记录,所以称这种 映射为A表对B表数据的一对一映射。(当然,反过来,你也可是说,是B表对A表的一对多映射)。 上述结构,如果用 POJO 来表示的话,可以参看下图: 如上图, Pet 中就可以有一个字段 master,通过自身的 masterId 指向一个 Master 对象,那么我们说 Pet.

  • 我在使用Spring通过java读取yaml时遇到了一个问题。让我先展示代码 我的yaml文件: spring上下文xml还具有以下功能: 在这里面,它说,所有的东西都是作为一个字符串而不是一个地图来阅读的。是否有其他类支持读取Yaml文件的方式:Spring boot-inject map from application.yml 还是我对YamlPropertiesFactoryBean的理解

  • 问题内容: 我有一个用户表和一个具有一对一映射表的表,其中一个字段用于此关系,该字段存储相应用户的ID字段值。 如何为此关系编写hibernate文件? 更新 我的问题是用户的主键是,user_detail的外键是 我在Internet用户user_id中获得的所有示例均作为用户主键,与其他表中的外键相同 问题答案: 对于用户映射…。 用于UserDetail映射。

  • person.hbm.xml: employee.hbm.xml 如何从表的和中提取表的映射? 注意:表的是主键

  • 如何定义两个类之间的< code >一对一关系?我想我在某个地方出了问题,在概念上。我不知道是什么,但确实是。 让我们假设有两个类命名为 和 : 现在对于一个国家来说,只能有一个PM,PM只能属于一个国家。如何在映射文件中执行此操作? 我在尝试这个: 但是这种有效的映射只会在运行时产生异常。它说属性在类中找不到!但是它在类中搜索吗?它应该在类中搜索。 也帮我完成这两个类之间的< code >一对一