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

使用JPA访问没有唯一id的视图会返回null

慕容弘懿
2023-03-14

我正在使用JPA,并有一个我想访问的视图。我在许多其他类中使用嵌入id的映射实体来访问具有类似要求的表。然而,在这里,每当包含id的视图中有空值时,整个对象都返回为null。当我查询时,有正确数量的实体返回,但它们为null。

以下是课程:

{
@Entity
@Table(name = "VW_PRODUCT")
public class VwProduct implements Serializable {
    @EmbeddedId
    private VwProductId id;

    public VwProduct() {
    }
}

{
@Embeddable
public class VwProductId implements java.io.Serializable {

    @Column(name = "PROD_NAME", nullable=true)
    private String prodName;
    @Column(name = "PROD_CTGRY", nullable=true)
    private String prodCtgry;
    @Column(name = "PROD_SBCTGRY", nullable=true)
    private String prodSbctgry;
}

我省略了getter、setter和hashcode等内容,但我认为我的问题很清楚;当视图的某些值为空时,如何访问该视图?非常感谢。

共有1个答案

尹超
2023-03-14

如果主键列为null,则对该列的搜索将始终不返回任何对象。

我知道有三种可能的解决方案,按复杂性/神奇性的顺序排列。(对于不使用只读视图的用户,请不要执行以下任何操作。您将用一把超大猎枪将脚打爆。)

最简单的答案是更改视图的定义,添加rowid或生成的序列号之类的内容,然后将其作为主键。

第二个答案是主键为@ID@ROWID String id;,这既是实现特定的,也是Hibernate特定的。

最后一个更复杂的答案是,将所有三个字段映射到一个“NullableString”UserType,并有一个nullSafeGet,将null映射到非null的对象,比如“”或其他对象。你会得到副本,但由于这是一个只读视图,你并不在乎。

 类似资料:
  • 在HBASE 0.98.4上使用Phoenix4.2版本(我知道是老版本)。

  • 我们有一个例子,我们要查询出历史信息,我们希望使用QueryDSL而不是原始SQL。历史表中的数据包含原始记录的id(Hibernate ENVERs),如果发生删除,则删除实际记录,但ENVERs记录包含原始id。 我们面临的问题是,由于创建Q类的实体只引用外键,这将强制SQL中的联接。由于使用Hibernate,我们无法引用多个字段的列。 null

  • 我有一个来自Firebase的使用隐式数据同步的对象列表,我想使用呈现它们的唯一id(用于url)以及其他数据属性。我可以让以这样一种方式返回,即我可以访问中的对象ID,就像的成员具有属性一样?如果没有,实现这一点的正确方法是什么?假设代码(不起作用): 控制器: 查看:

  • 问题内容: 我有一个具有以下结构的数据库: 当我尝试创建EntityProperty类时 我得到以下异常: 我知道JPA实体必须具有主键,但是由于无法控制的原因,我无法更改数据库架构。是否可以创建将与这样的数据库模式一起工作的JPA(hibernate)实体? 问题答案: 我猜您有一个组合键,其中的外键是。如果是这样,则可以按如下所示进行映射:

  • 我正在Codeigniter中创建API。在这个API中,我为用户提供了一个登录函数。如果登录成功,我将在CI会话中设置用户数据,并将会话返回给用户。 现在,用户可以使用该会话ID来验证他自己的所有其他请求,如添加/更新/删除。基本上,我希望当用户发送下一个请求时,我可以根据他的会话ID验证他的凭据。 客户请求代码: 上面是一个从客户端到服务器的登录请求示例。在服务器端,服务器验证客户端提供的凭据

  • 我在里面使用了。我还将设置为false for 支持较低的API