当前位置: 首页 > 面试题库 >

从数据库中检索一行作为Hibernate中的Map

裘臻
2023-03-14
问题内容

Players

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,以对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();

但这不映射列表,包和其他映射对象,而仅映射原始列名称和值…



 类似资料:
  • 我正在两个标记之间画一条路线,我想保存那条路线。为此,我将包含lat和lng的ArrayList保存在Firebase数据库中。但我在取回航路点时遇到了问题。我是这样插入的: 在检索数据时,我尝试执行以下操作:

  • 我有一个名为employee_comp_field的表,其中提供了薪资字段 然后,我有另一个表,其中员工工资数据存储emp_compensation每个字段。正如你所看到的emp_id 10有三套记录,因为他在同一年获得了三次加薪(year_id=101),这可以通过salary_order领域来识别。 我想用最大工资确定所有雇员的名单,我的期望输出如下: emp_id10号得到了三次加薪……所以

  • 我们在学校使用hibernate,我们正在实施贷款。我们有一个持续的贷款类别,根据贷款信息(付款金额、到期总额等),应用程序应计算特定贷款的全部付款报价。 因此,我们有一个Quote类,其中包含有关该Quote的信息,Loan类有一个所有Quote的列表(类之间的组合)。 由于报价信息是可计算的,我认为它不应该出现在数据库中。 我的问题是,当Hibernate从DB获得贷款时,如何让它计算并填充报

  • 我试图创建一个简单的程序,从用户的名字,手机号码和电子邮件地址,然后把数据在Firebase实时数据库。 有3个输入框和一个按钮,按一下就可以完成上面的操作。代码如下: 我这样设置了消防基地:

  • 问题内容: 我正在制作一个程序,可以从我创建的数据库中检索字段的输入数据/值。但是,当我运行它时,输出始终为null。不知道怎么了 这是我的代码: 在我的主班我有以下代码: 我不知道为什么我运行它时总是说null。 问题答案: 您实际上并没有在设置员中“设置”任何东西。 最重要的是:我对getter和setter的理解使您可以在getter中进行查询。

  • 我想从sqlite数据库添加的数据中在listview中显示我的所有数据。当我单击save按钮时,它显示一条消息“added successful”。但每次它都显示错误消息“data not found”。为什么不显示listview? 错误显示如下: MyDatabaseHelper.java