考虑一个有四个字段的实体(是的,它不是一个有效的Java代码,仅用于演示):
@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 :(得分:2)
尝试这样的事情:
em.createNamedQuery("SELECT id, date, cast(null as char(1)) name, cast(null as char(1)) kind from sale", Sale.class);
请注意char
可能需要根据name
和kind
的数据类型进行更改。
答案 1 :(得分:1)
额外的列是否声明为NULLable
并具有DEFAULT
值?
这可能有效:
em.createNamedQuery("SELECT id, date, NULL, NULL FROM sale", Sale.class);
在各列的正确位置放置NULL
。也许这是必需的:
em.createNamedQuery("SELECT
id,
date,
NULL AS name,
NULL AS kind
FROM sale", Sale.class);
答案 2 :(得分:1)
您可以使用一些解决方案:
使用构造函数表达式:
List<Sale> sales = em.createQuery(
"SELECT new com.your.package.Sale(" + // Full package
" s.id, " +
" s.date " +
" ) " +
"FROM Sale s ", Sale.class).getResultList();
使用ResultTransformer
List<Sale> sales = em.createQuery(
"SELECT s.id, s.date " +
"FROM Sale s ", Sale.class)
.unwrap(org.hibernate.query.Query.class)
.setResultTransformer(custom)
.getResultList();
自定义转换器在哪里:
ResultTransformer custom = new ResultTransformer() {
@Override
public Object transformTuple(Object[] tuple, String[] aliases) {
Sale s = new Sale();
// s.setTitle = tuple[0]
// s.setDate = tuple[1]
return s;
}
@Override
public List transformList(List collection) {
return collection;
}
}
使用Hibernate Criteria API /使用JPA Criteria API