2014-08-13 3 views
0

Я хочу прочитать поле в неизвестном объекте, возвращаемом с помощью запроса на спящий режим. Я знаю, что рефлексию можно использовать здесь. Но есть ли доступный Hibernate API для этого? У меня есть только объект и значение аннотации @Column.Hibernate - есть ли API для получения значения поля неизвестного объекта?

Например: Допустим, я следующий класс

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

Когда Hibernate возвращает этот объект как часть запроса, я хочу, чтобы получить значение имени поля, используя «NICK_NAME» имя атрибута.

РЕДАКТИРОВАТЬ:

Мое требование, чтобы получить значение конкретного поля от объекта, возвращаемого Hibernate. Я объясню на примере

Object obj = queryHibernateForObject(); 

Скажем, OBJ имеет тип лица, и я хочу, чтобы принести значение поля «NICK_NAME» от этого объекта.

ответ

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")); 
} 

В этом случае важно использовать псевдонимы выбора. В противном случае вы получите ключи на карте как «0», «1», ...

+0

Я обновил вопрос с помощью моего требования –

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 из памяти - не может быть ошибки синтаксиса.

Смежные вопросы