休眠 - 是否有任何 API 来获取未知对象的字段值?



我想读取hibernate查询返回的未知对象上的字段。我知道这里可以用反射。但是有Hibernate API可以做到这一点吗?我只有@Column注释的对象和值。

例如:假设我有一个类
class Person {
    @Column(name = "nick_name")
    String name;
}

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

编辑:

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

Object obj = queryHibernateForObject();

假设obj是Person类型,我想从这个对象中获取"nick_name"字段的值

没有查询是不干净的,但我认为你有这样的情况处理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中使用别名是很重要的。否则,您将获得映射键为"0","1",…

你可以使用反射:

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上从内存中插入-可能有语法错误。

最新更新