2017-06-07 27 views
1

考虑它有四个字段的实体(是的,它是不是一个有效的Java代码,只是为了演示):抓取完全的对象与Hibernate映射为本地查询

@Entity 
Sale { 
    id, date, name, kind 
} 

我可以很容易地选择他与实体管理器实体如:

em.find(Sale.class, id) 

但是如果我想作一个简单的查询,并填补了这一目标,我可以通过本地查询做简单对象:

em.createNativeQuery("SELECT s.id, s.date FROM sale s", Sale.class) 

的问题是,因为有遗漏的领域,我越来越失踪列的错误:SQLException: Column name not found.

有没有办法告诉Hibernate忽略缺失列,使我们可以只获取我们所需要的列?

编辑:其中一个答案建议为每个缺失的列选择NULL。问题是可能有大约40列,我当然不想将它们全部命名。

+0

'em.selectNative究竟是什么(“s.id,s.date”,Sale.class)'?这不是JPA API,所以请使用JPA API重新格式化。这里的人不知道“你的API” –

+0

你有这个类的构造函数只需要“id”和“date”? –

+0

这只是一个简化,默认的构造函数是空的,Hibernate不是通过构造函数设置字段,而是通过字段上的反射来设置字段。我的观点是我想创建实体而不必从数据库读取整行。 –

回答

1

尝试这样:

em.createNamedQuery("SELECT id, date, cast(null as char(1)) name, cast(null as char(1)) kind from sale", Sale.class); 

请注意,char可能需要根据数据类型的namekind改变。

+0

好吧,这会起作用,问题是有大约40列,我当然不想将它们全部命名为:/ –

+0

实际上,即使您只打算使用2,拉动40列的开销并不是很差。也就是说,如果你真的想要的话,你总是可以为表定义一个不同的实体,只有几个选择列 –

+0

我知道这并不坏,但它使查询真的很长,当实体改变时,这个查询将会有以及可能导致人为错误的改变。我仍然不喜欢写所有的专栏。另外我不想定义一个新的实体,因为我不能在不使用某些接口的情况下替换这两个实体。 –