Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > выполнение обычного SQL в hibernate


Автор: alexadr 8.12.2007, 15:37
Сразу прошу прощение за то что пложу темы. Подобную тему уже открывал, но просто запутался(http://forum.vingrad.ru/forum/topic-185944/kw-hibernate-sql--query.html)

Короче меня интересует как можно выполнить обычный SQL запрос используя Hibernate, при этом результат запроса смэпить на некий POJO.

Имеем две таблицы(в общем случае хоть 50):

Код

create table person (
id int,
name text  
)

create table clothes (
id int,
id_pers int,
name text  
)


Т.е. одна таблица про "человеков", вторая про одежды. Хочу сделать запрос, - выбрать для каждого человека его одежду. Те.

Код

select prs.name, cl.name from person prs, clothes cl where prs.id=cl.id_pers


Так вот имеено этот запрос я хочу выполнить средствами гибернейта.

Для этого для начала я создам фабрику, сессию и открою транзакцию:

Код

        SessionFactory sf = new Configuration().configure().buildSessionFactory();
        Session sn = sf.getCurrentSession();
        sn.beginTransaction();



Далее я создаю сам запрос:
        
Код

        SQLQuery query = sn.createSQLQuery("select prs.name, cl.name from person prs, clothes cl where prs.id=cl.id_pers");



Теперь собственно как мне на некицй POJO класс смепить результат этого запроса?


Автор: LSD 8.12.2007, 15:45
Посмотри http://www.hibernate.org/hib_docs/v3/reference/en/html/querysql.html (раздел 16.1.2. Entity queries).

Автор: alexadr 8.12.2007, 15:56
честно говоря этот раздел пересмотрел неколько раз

Если я правильно понял, то любой POJO класс на который может быть смэплин результат должен быть описан в xml-файле. При этом данному классу необходимо указать таблицу из базы:
Код

<hibernate-mapping>
    <class name="ResultPOJO" table="???????">
          ...........
    </class>
</hibernate-mapping>

А какую мне таблицу указывать, если результат запроса запись не из одной таблицы?
Плюс я могу усложнить запрос добавив некие функции типа count(), max() итп...

Автор: LSD 9.12.2007, 00:45
1. POJO это прото красивое слово, в Hibernate нет понятия POJO, хотя они его и не однократно упомнинают.
2. Мапить можно только на entity.

Автор: alexadr 10.12.2007, 11:57
Блин, ну а где эти entity описываются, по hibernate-mapping-3.0.dtd они "хаотично"  встречаются в виде атрибутов/элементов?

Автор: LSD 11.12.2007, 00:11
Я был не прав, замапить можно на любой объект, делается это так, есть некий объект:
Код

package ru.vingrad.lsd.test.hibenate;

public class Summary
{
  private String name;
  private double total;

  public Summary()
  {
  }

  public String getName()
  {
    return name;
  }

  public void setName(String name)
  {
    this.name = name;
  }

  public double getTotal()
  {
    return total;
  }

  public void setTotal(double total)
  {
    this.total = total;
  }

  @Override
  public String toString()
  {
    return getClass().getSimpleName() + "[" +
           "name = " + name +
           ", total = " + total +
           "]";
  }
}

далее делаем так:
Код

session.createSQLQuery("SELECT name as \"name\", price * amount as \"total\" FROM products").setResultTransformer(Transformers.aliasToBean(Summary.class));

проблема только в том, что приходится имена колонок задавать в точности как имена пропертек, с учетом регистра.

Автор: Platon 11.12.2007, 00:15
Простите, что лезу со своими тараканами в эту тему, но я не пойму, почему моя такая же http://forum.vingrad.ru/index.php?showtopic=185815&view=findpost&p=1340370?!

Добавлено через 1 минуту и 9 секунд
Я делаю такой же бин, но вылетает ошибка.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)