Hibernate - 是否有任何API可以获取未知对象的字段值?

时间:2014-08-13 05:45:07

标签: java hibernate reflection annotations

我想读取hibernate查询返回的Unknown对象上的字段。我知道这里可以使用反射。但是有没有可用的Hibernate API呢?我只有@Column注释的对象和值。

例如:让我们说我跟随课程

class Person {
    @Column(name = "nick_name")
    String name;
}

当Hibernate将此对象作为查询的一部分返回时,我想使用" nick_name"来获取字段名称的值。 name属性。

修改

我的要求是从Hibernate返回的对象中获取特定字段的值。我将以一个例子来解释

Object obj = queryHibernateForObject();

让我们说obj属于Person类型,我想获取" nick_name"的值。该对象的字段。

2 个答案:

答案 0 :(得分:0)

没有询问不干净,但是认为有这样的状况 Handling Unknown Objects in ArrayList

您可以使用Object []:

String sql = "select s.rollNo, s.name, s.address from Student s";
Query query = session.createQuery(sql);
List list = query.list();
Iterator iterator = list.iterator();
for (Iterator it = query.iterate(); it.hasNext();) {
    Object[] object = (Object[]) it.next();
    System.out.println(object[0]);
    System.out.println(object[1]);
    System.out.println(object[2]);
}

或者您可以使用JPA查询功能:

String sql = "select new com.some.pkg.SomeDtoClass(s.rollNo, s.name, s.address) from Student s";
Query query = session.createQuery(sql);
List<SomeDtoClass> list = (List<SomeDtoClass>)query.list();

在查询中指定完整的类名非常重要。 SomeDtoClass也应该有适当的构造函数。

或者您可以使用setResultTransformer(AliasToEntityMapResultTransformer.INSTANCE)

String sql = "select s.rollNo as rollNo, s.name as name, s.address as address from Student s";
Query query = session.createQuery(sql);
query.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
List list = query.list();
Iterator iterator = list.iterator();
while(iterator.hasNext()){
    Map map=(Map)iterator.next();
    System.out.println(map.get("rollNo"));
    System.out.println(map.get("name"));
    System.out.println(map.get("address"));
}

在这种情况下,在select中使用别名很重要。否则你会得到地图键&#34; 0&#34;,&#34; 1&#34;,...

答案 1 :(得分:0)

你可以使用反射:

public static <T> getFieldByColumnName(Object obj, String columnName) throws Exception {
    for (Field field : obj.getClass().getDeclaredFields()) {
        Annotation a = field.getAnnotation(Column.class);
        if (a != null && a.getValue().equals(columnName)) {
            return <T> field.get(obj);
        }
    }
    throw new IllegalArgumentException("No such column:" + columnName);
}

免责声明:从内存中读取iPhone - 可能存在语法错误。