【问题标题】:How do I tell Hibernate to not create a table for this Entity?如何告诉 Hibernate 不要为该实体创建表?
【发布时间】:2013-10-22 10:13:42
【问题描述】:

我正在使用 SqlResultSetMappingEntity 注释(SqlResultSetMapping 需要一个带有 Id 的实体)来告诉 Hibernate 如何使用本机查询结果数据填充 Foo 的实例。

非持久化实体:

@SqlResultSetMapping(name = "fooMapping", entities = @EntityResult(entityClass = Foo.class))
@Entity
public class Foo {
    @Id
    public Long row_id;
    public String name;
}

本机查询:

String sql = "SELECT id AS row_id, friendlyName AS name FROM SomeTable"; 
Query q = JPA.em().createNativeQuery(sql, "fooMapping");
List<Foo> fooList = q.getResultList();

问题是,为我自动创建了一个名为“Foo”的表(在开发模式下使用 Play!Framework),但 Foo 不是模型,不应该被持久化。

如何指示hibernate不要创建这个表?

【问题讨论】:

    标签: java hibernate jpa playframework-1.x nativequery


    【解决方案1】:

    一旦可用于您的持久层,使用@ConstructorResult 将非常有用。在那之前,有一种特定于 Hibernate 的方法使用 org.hibernate.SQLQuery 和不依赖于 @SqlResultSetMappingorg.hibernate.transform.ResultTransformer。因为填充了 POJO,Hibernate 找不到 @Entity 来自动变成表格。

    非持久化 POJO:

    public class Foo {
        public Long row_id;
        public String name;
    }
    

    结果转换器:

    public static class FooResultTransformer implements ResultTransformer {
    
        @Override
        public List transformList(List list) { return list; }
    
        @Override
        public Object transformTuple(Object[] tuple, String[] aliases) {
            List<String> aliasList = Arrays.asList(aliases);
            Foo foo = new Foo();
            foo.row_id = ((Number) getValue(tuple, aliasList, "row_id", 0L))
                .longValue();
            foo.name = (String) getValue(tuple, aliasList, "name", null);
            return foo;
        }
    
        private static Object getValue(Object[] tuple, List<String> aliases,
                String field, Object defaultValue)
        {
            // unchecked for berevity
            if (tuple[aliases.indexOf(field)] == null) {
                return defaultValue;
            }
            return tuple[aliases.indexOf(field)];
        }
    
    }
    

    本机 SQLQuery:

    String sql = "SELECT id AS row_id, friendlyName AS name FROM SomeTable";
    Session session = JPA.em().unwrap(Session.class);
    SQLQuery q = session.createSQLQuery(sql);
    
    q.setResultTransformer( new FooResultTransformer() );
    List<Foo> fooList = q.list();
    

    【讨论】:

      【解决方案2】:

      不幸的是,这并不容易......

      如果您使用 JPA 2.1 对 @ConstructorResult 的支持(似乎只有 hibernate 4.3.0.Beta2 支持,所以您可能没有使用),您可以按如下方式使用 @ConstructorResult:

      @SqlResultSetMapping(name="fooMapping", 
        classes={ 
          @ConstructorResult(targetClass=Foo.class, columns={
              @ColumnResult(name="row_id", type=Integer.class),
              @ColumnResult(name="name", type=String.class)
          })
        }
      )
      
      public class Foo {
      
          public Long row_id;
          public String name;
      
          public Foo(Long rowId, String name) {
          ...
          }
      
      }
      

      【讨论】:

      • 期待这个;我将坚持一个适用于 JPA 2.0 或非 beta Hibernate 的答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-22
      • 2012-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-22
      相关资源
      最近更新 更多