使用Hibernate Mapping获取不完整的对象作为本机查询

时间:2017-06-07 10:12:09

标签: java mysql hibernate jpa

考虑一个有四个字段的实体(是的,它不是一个有效的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列,我当然不想全部命名。

3 个答案:

答案 0 :(得分:2)

尝试这样的事情:

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

请注意char可能需要根据namekind的数据类型进行更改。

答案 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)

您可以使用一些解决方案:

  1. 使用构造函数表达式:

    List<Sale> sales = em.createQuery(
        "SELECT new com.your.package.Sale(" + // Full package
        "       s.id, " +
        "       s.date " +
        "   ) " +
        "FROM Sale s ", Sale.class).getResultList();
    
  2. 使用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;
        }
    }
    
  3. 使用Hibernate Criteria API /使用JPA Criteria API