2013-03-19 2 views
4

Есть ли способ использовать функциональность java bean для несвязанных таблиц?Hibernate, запрашивающий неотображаемые таблицы

Итак, у меня есть таблица, которая используется только для чтения, она никогда не будет изменена. Мне нужно запросить его только для отображения данных. Но я не хочу, чтобы возвращаемый тип Object [], спящий по умолчанию, когда запрашивает неотображаемые объекты. Я хочу получить результаты в пользовательскую типизированную коллекцию. Но мне нужно будет создать файл hbm для этого. Нужно ли вообще создавать пользовательский тип и файл hbm?

Businessobj метод, который загружает результаты:

loadResults() 
{ 
    String qry = "select col1, col2 from table";     
    List<CustomType> result = (ArrayList<CustomType>) dao.HQLWithTransformer(qry, new CustomTransformer()); 
} 

Пользовательские трансформаторные:

public class CustomTransformer implements ResultTransformer { 



@Override 
public Object transformTuple(Object[] rowdata, String[] arg1) 
{  

     return new CustomType(String.valueOf(rowdata[0]),String.valueOf(rowdata[1])); 

    return null; 
} 

@Override 
public List transformList(List arg0) { 
    return null; 
} 

}

метод DAO:

public Collection HQLWithTransformer(String qry, ResultTransformer rt){  

    List<?> al=null; 
     try 
     {    
     Query q = sess.createQuery(qry); 
     q.setResultTransformer(rt); 
     al = (ArrayList<?>)q.list();     
     } 
     catch(HibernateException he) 
     {  
     log.debug("Hibernate Exception", he); 
     } 
     finally 
     { 
     sess.close();   
     } 

    return al; 
    } 

ответ

2

Вы также можете использовать конструктор выражений, например:

List<MyClass> dtos = session.createQuery("SELECT NEW com.example.MyClass(e.name, e.data) FROM Entity e").list(); 

Недостатком является то, что вы также должны создать Entity, отображение таблицы, для того, чтобы запросить за него. Вы можете сделать это с аннотациями, поэтому вам не придется создавать файл hbm.

Технически это не совсем то, о чем вы просили. Я нашел это полезным для сопоставления запросов, похожих на отчет, хотя, возможно, это то, что вы ищете.

+0

попробовал аннотации. По какой-то причине аннотации не распознаются. У моего класса есть hibernate-jpa-2.0-api-1.0.0.Final.jar, hibernate3.jar (3.5), hibernate-validator-4.0.2.GA.jar. – sotn

+0

Мне удалось выяснить, почему аннотации не работают. Были некоторые проблемы с настройкой. – sotn

+0

@sotn круто, рад, что вы поняли это :) – kostja

0

Вы можете установить ResultTransformer для вашего запроса.

Hibernate предоставляет различные трансформаторы, которые могут преобразовывать результаты запроса в неотображаемые типы. Например, AliasToBeanResultTransformer выполняет преобразование на основе псевдонимов выбранных полей.

+0

Создал собственный трансформатор. мой код в OP. Я все еще вижу, что таблица не отображает ошибку. – sotn

+0

Таблицы без отображения могут запрашиваться только с SQL-запросами, а не с запросами HQL. Используйте 'createSQLQuery()'. – axtavt

1

Вы можете использовать библиотеку NativeCriteria (Project on github, available on maven central). Пример кода выглядит следующим образом:

NativeCriteria c = new NativeCriteria(new HibernateQueryProvider(hibernateSession), "table_name", "alias"); 
c.setProjection(NativeExps.projection().addProjection("alias.column_name")); 
c.add(NativeExps.isNull("alias.column_name")); 
c.setOrder(NativeExps.order().add("alias.column_name", OrderType.ASC)); 
CriteriaResult res = c.criteriaResult(); 
while (res.next()) 
{ 
    resp.add(res.getLong(0, null)); 
} 

Offical page библиотеки. Эта библиотека основана на сеансе hibernate и createSQLQuery, но предоставляет очень простой и простой API для генерации динамических и сложных запросов, которые не имеют эквивалента в виде сопоставленного класса.

На тестовом модуле вы можете увидеть больше примеров (и интеграции с Spring/Spring Boot).

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