使用查询
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();
但这不映射列表,包和其他映射对象,而仅映射原始列名称和值…
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)