Функция размера hibernate создает sql, который не работает в Oracle 11g - PullRequest
1 голос
/ 14 марта 2011

Когда Hibernate разбирает этот hql:

UPDATE VERSIONED Person SET groupsCount = followingGroup.size WHERE id = :id

генерирует этот sql:

UPDATE Person
  SET version  =version+1,
  groupsCount=
  (SELECT COUNT(followingg1_.followerId)
     FROM GroupFollower followingg1_
    WHERE Person.id=followingg1_.followerId
  )-1
  WHERE id IN
  (SELECT groupfollo2_.followerId
     FROM GroupFollower groupfollo2_
    WHERE groupfollo2_.followingId=?
  )

Этот запрос завершается с ошибкой «-1» после подзапроса для подсчета следующих идентификаторов. Если я вынимаю «-1», он работает нормально, или если я перемещаю «-1» в «SELECT COUNT (followg1_.followerId) - 1», это также работает.

Я не вижу, как обойти эту проблему, если не использовать специфичный для БД sql, это ошибка с 11g?

Ответы [ 2 ]

1 голос
/ 17 марта 2011

Хорошо, я обнаружил проблему, я был не прав, это утверждение имеет дело с объектом "Person", который является более сложным, чем я впервые осознал, хотя именно в этой строке тест не удался, на самом деле это был hql в класс это было тестирование, которое произвело SQL, который был проблемой.

UPDATE VERSIONED Person SET groupsCount = followingGroup.size - 1 WHERE id IN (SELECT etc...)

Таким образом, это отвечает на первую часть, вторая часть ответа состоит в том, что это известная ошибка, по-видимому, в Oracle 10g, что вы не можете выполнять арифметические операции после подзапроса в операторе обновления (duh!), Поэтому изменив вышеприведенное значение на

UPDATE VERSIONED Person SET groupsCount = - 1 + followingGroup.size WHERE id IN (SELECT etc...)

работает просто отлично. phew-

1 голос
/ 15 марта 2011

Следующее работает над экземпляром 11.2.0.2 за apex.oracle.com

create table person (id number, version number, groupscount number);

create table groupfollower (followerid number, followingid number);

insert into person values (1,1,0);
insert into person values (2,1,0);
insert into groupfollower values (1,2);


UPDATE Person
  SET version  =version+1,
  groupsCount=
  (SELECT COUNT(followingg1_.followerId)
     FROM GroupFollower followingg1_
    WHERE Person.id=followingg1_.followerId
  )-1
  WHERE id IN
  (SELECT groupfollo2_.followerId
     FROM GroupFollower groupfollo2_
    WHERE groupfollo2_.followingId=2
  )

Предлагаю вам проверить этот SQL в вашей версии. Это может быть проблема Hibernate.

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