【问题标题】:Column mapping confusion列映射混乱
【发布时间】:2018-02-17 06:10:02
【问题描述】:

一个表:NAME (varchar2), AGE (varchar2), ID_NO (varchar2)

B 表:NAME (varchar2), ADDRESS (varchar2)

我得到了这样的实体

@Entity
public calss A {
    @Column(name="NAME")
    private String name;
    @Column(name="AGE")
    private String age;
    @Column(name="ID_NO")
    private String idNo;
    @Column(name="ADDRESS")
    private String address;
}

当我执行这段代码时:

session.createsqlQuery("SELECT * FROM A ").addEntity(A.clss).uniqueResult();

我得到 SQLException 意味着地址列不存在。而且我不想把@Transient放到Address列,因为我希望我可以像这样使用这个实体来使用B表:

session.createsqlQuery("SELECT * FROM B ").addEntity(A.clss).uniqueResult();

如何才能成功获得此结果?

【问题讨论】:

  • 为什么不创建类B,扩展A 并在B 上移动字段地址?
  • 您有 2 个表和一个不代表这两个表的实体。你需要的是一个教程。甚至可能有几个教程。
  • 我认为 Hibernate 不允许这样做。您可以查看答案here
  • @AlbertBos 你说得对,我唯一能做的办法,谢谢~

标签: java hibernate


【解决方案1】:

简短的回答:你不能。

如果你想拥有这种东西,你应该创建类层次结构(至少没有@Inheritance 和其他我希望你自己谷歌的东西):

@Entity
public calss A {
    @Column(name="NAME")
    private String name;
    @Column(name="AGE")
    private String age;
    @Column(name="ID_NO")
    private String idNo;
}

@Entity
public class B extends A {
    @Column(name="ADDRESS")
    private String address;
}

但是,它也不起作用,因为您应该指定 @Id 列。

【讨论】:

  • 起初,我尽量不生成大量的表实体,但这似乎是不可避免的
  • @C.Eason 是的,是的。但是这样做的目的是什么?默认情况下,您将拥有单个表层次结构,因此无需再创建一个表。我没有看到任何其他潜在的疑问
  • 在我的旧项目中,有很多复杂的sql,他们在那里没有使用hibernate,现在我想将查询方法更改为hibernate,但是sql已经加入了很多表或太多的子查询......你能给我一些关于处理复杂sql的建议吗?
  • @C. Eason 我想到的主要建议是明智地加入。当心size(collection_name) 之类的东西以及所有这些东西,因为它会导致子查询并且可能是性能成本。看看here。还要小心急切/延迟集合获取,因为您可能会突然获取整个集合,或者忘记触发延迟集合获取。我想这主要是我想到的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-22
  • 1970-01-01
  • 1970-01-01
  • 2023-02-17
  • 2011-05-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多