java - 从 DB 中检索一行作为 Hibernate 中的 Map

标签 java database hibernate jpa

玩家:

ID | name  | email | age | ...
1  | 'bob' | null  | 23  | ...

此表是保存类 Player 实例的地方(每个实例一行,无组合等)。

有一个 Hibernate Session我如何获取该行(比如 id - PK - 等于 1)作为 Java Map (键 = 列名,值 = 单元格值) ?

示例用法:

Map<String,String> row = getPlayerByIdAsMap(1);

最佳答案

使用带有AliasToEntityMapResultTransformer 的查询;很冗长,但应该与 Hibernate 属性定义一起使用而不是与 JavaBean 定义一起使用(它们可以不同)。

Map<String,Object> aliasToValueMap = 
    session.createCriteria(User.class)
      .add(Restrictions.idEq(userID))
      .setProjection(Projections.projectionList()
        .add(Projections.id().as("id"))
        // Add others properties
      )
      .setResultTransformer(AliasToEntityMapResultTransformer.INSTANCE)
    .uniqueResult();

一个更糟糕的方法是编写一个自定义的 ResultTransformer,它会内省(introspection) ClassMetadata 并尝试提取值...

class IntrospectClassMetadata extends BasicTransformerAdapter {
  PassThroughResultTransformer rt = PassThroughResultTransformer.INSTANCE;
  public Object transformTuple(Object[] tuple, String[] aliases) {
    final Object o = rt.transformTuple(tuple, aliases);
    ClassMetadata cm = sf.getClassMetadata(o.getClass());
    List<String> pns = new ArrayList<String>(Arrays.asList(cm.getPropertyNames()));
    Map<String, Object> m = new HashMap<String, Object>();
    for(String pn : pns) {
      m.put(pn, cm.getPropertyValue(o, pn));
    }
    m.put(cm.getIdentifierPropertyName(), cm.getIdentifier(o));
    return m;
  }
}

和使用

Map<String,Object> aliasToValueMap = 
        session.createCriteria(User.class)
          .add(Restrictions.idEq(userID))
          .setResultTransformer(new IntrospectClassMetadata())
        .uniqueResult();

最后的机会:

Map<String,Object> map = (Map<String,Object>)s.createSQLQuery("select * from user where id = :id")
  .setParameter("id",p.id)
  .setResultTransformer(AliasToEntityMapResultTransformer.INSTANCE)
.uniqueResult();

但这不映射列表、包和其他映射对象,而只映射原始列名和值...

关于java - 从 DB 中检索一行作为 Hibernate 中的 Map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22016152/

相关文章:

java - Logback 和 SLF4J 编程配置

java - 如何在用Java编写的多模块 Play 项目中运行单元测试

java - 以编程方式执行 shell 命令不起作用

database - 使用hibernate时如何为数据字典设计表?

python - Django 1054 - 字段列表中的未知列

java - 具有通用返回类型的 vararg 方法中的 @SafeVarargs

java - 如何使用两个 jar 配置 JVM Argument -javaagent

java - 使用java在mysql数据库中创建和插入文件

java - 嵌入模式下的 h2 并发更新

mysql - 如何在mongodb和mysql中搜索搜索到的子字符串中的某个字符串?