Par*_*bay 5 java database hibernate jpa
表Players:
ID | name | email | age | ...
1 | 'bob' | null | 23 | ...
Run Code Online (Sandbox Code Playgroud)
此表是Player持久化类的实例的位置(每个实例一行,没有组合等).
有了Hibernate Session,我如何获得行(比如id - PK - 等于1)作为Java Map(key =列名,值=单元格值)?
用法示例:
Map<String,String> row = getPlayerByIdAsMap(1);
Run Code Online (Sandbox Code Playgroud)
使用查询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();
Run Code Online (Sandbox Code Playgroud)
更糟糕的approch可以编写一个自定义的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;
}
}
Run Code Online (Sandbox Code Playgroud)
并使用
Map<String,Object> aliasToValueMap =
session.createCriteria(User.class)
.add(Restrictions.idEq(userID))
.setResultTransformer(new IntrospectClassMetadata())
.uniqueResult();
Run Code Online (Sandbox Code Playgroud)
最后的机会:
Map<String,Object> map = (Map<String,Object>)s.createSQLQuery("select * from user where id = :id")
.setParameter("id",p.id)
.setResultTransformer(AliasToEntityMapResultTransformer.INSTANCE)
.uniqueResult();
Run Code Online (Sandbox Code Playgroud)
但这不会映射列表,包和其他映射对象,而只是原始列名和值...
| 归档时间: |
|
| 查看次数: |
5304 次 |
| 最近记录: |