Hibernate select запрос с другим предложением where - PullRequest
0 голосов
/ 20 февраля 2012

Это может быть довольно просто, но я провел в Google несколько часов, но не смог найти подходящий ответ.

Я пытаюсь перевести приведенную ниже логику в спящий режим, но не могу понять, как это сделать. Это мои настройки: база данных Mysql с 2 таблицами T1 (ID, C1, C2) и T2 (column1, column2, column3). Это то, что я хочу реализовать

    results = select ID, from T1 //This will result in multiple rows.

    for(eachRow in results )
    {
    select column1,column2,column3 from T2 where ID=eachRow.ID
    //Do some computation like
    //Assign value of table "T1" column "C1" to table "T2" column "column1"
    column1 = eachRow.C1

    }

На данный момент я мог бы придумать логику чтения всей таблицы, используя предложение Hibernate «from», в List и итерацию по нему. Однако это может вызвать исключение OutOfMemory. Не могли бы вы подсказать, каким должен быть HQL?

Это то, что я сделал

Session session = HibernateSession.getSessionFactory().openSession();
        Transaction aTableTx = null;
        try {
            aTableTx = session.beginTransaction();

            _allRows = session.createQuery("from T1").list();

            for (Iterator<T1> iterator = _allRows.iterator(); iterator.hasNext();)
            {
                T1 aRow = iterator.next();
                //Here I am planning to run a similar to
                            //_allRows = session.createQuery("from T2").list();
                            //Store the result and iterate through the list, but 
                            //it is very inefficient.
            }

            aTableTx.commit();

Ответы [ 2 ]

0 голосов
/ 28 мая 2013

Выполняя итерацию в таблице T1, вы можете запустить запрос, в котором будет предложение where, например:

T1 aRow = iterator.next();
Query query= sessionFactory.getCurrentSession().createQuery("from T2 as where T2.ID=:aRowID");
query.setInteger("aRowID", aRow.ID);
0 голосов
/ 20 февраля 2012

Вы можете прокрутить результаты запроса, используя метод scroll() (или iterate()), а не метод list().

Обязательно регулярно очищайте и очищайте сеанс, как объяснено в документации по пакетным обновлениям .

Кроме того, во внутреннем запросе должно быть как минимум предложение where, как в вашем псевдо-SQL-запросе. Вероятно, эти две сущности должны быть связаны со столбцом OneToMany или OneToOne, что позволит полностью избежать необходимости в этом внутреннем запросе.

Я думаю, что лучше всего было бы прочитать документацию по Hibernate.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...