Как удалить данные из разных классов домена? - PullRequest
0 голосов
/ 22 февраля 2012

Я работаю в Grails. Я пишу код, который удаляет учетную запись определенного вошедшего в систему пользователя после того, как он нажал на ссылку Удалить. Теперь это мой код, найденный в моем контроллере,

def delete = {
   def account = springSecurityService.getCurrentUser()
   def registrant = Registrant.findByAccount(account)
   def loggeduser = registrant.account.username

   RegistrantEligibilityInformation.executeUpdate("delete RegistrantEligibilityInformation as rei where rei.registrant in (select reg from Registrant as reg where reg.account.username in(:loggeduser))",[loggeduser:loggeduser])
   RegistrantEducationInformation.executeUpdate("delete RegistrantEducationInformation as reduc where reduc.registrant in (select reg from Registrant as reg where reg.account.username in(:loggeduser))",[loggeduser:loggeduser])
   Registrant.executeUpdate("delete Registrant as reg where reg.account.username in(:loggeduser)",[loggeduser:loggeduser])
   AccountRole.executeUpdate("delete AccountRole as actrole where actrole.account.username in(:loggeduser)",[loggeduser:loggeduser])
   Account.executeUpdate("delete Account as act where  act.username in(:loggeduser)",[loggeduser:loggeduser])               

   toolsService.deletion(registrant)
}

У меня есть пять классов доменов: RegistrantEligibilityInformation, RegistrantEducationInformation, Registrant, AccountRole и Account. Каждый раз, когда я запускаю свою программу, я получаю сообщение об ошибке, подобное этому:

URI: /user/profile/delete
Class: org.postgresql.util.PSQLException
Message: ERROR: column reference "id" is ambiguous Position: 49

... который относится к этому коду:

RegistrantEligibilityInformation.executeUpdate("delete RegistrantEligibilityInformation as rei where rei.registrant in (select reg from Registrant as reg where reg.account.username in(:loggeduser))",[loggeduser:loggeduser])

... и я думаю об остальных моих кодах тоже. Я не знаю, что делать, так как я все еще новичок в Grails.

1 Ответ

2 голосов
/ 22 февраля 2012

Используйте in, когда у вас есть коллекция предметов, а не один - используйте =, когда она должна совпадать. Так что in имеет смысл для подзапросов, но не совпадает с логгом пользователя.

Я не уверен, почему Hibernate не поддерживает используемый подзапрос, но он работает, если вы сопоставляете идентификатор вместо целого объекта:

RegistrantEligibilityInformation.executeUpdate(
   "delete RegistrantEligibilityInformation as rei where rei.registrant.id in (" +
   "select reg.id from Registrant as reg where reg.account.username=:loggeduser)",
   [loggeduser:loggeduser])

RegistrantEducationInformation.executeUpdate(
   "delete RegistrantEducationInformation as reduc where reduc.registrant.id in (" +
   "select reg.id from Registrant as reg where reg.account.username=:loggeduser)",
   [loggeduser:loggeduser])

Registrant.executeUpdate(
   "delete Registrant as reg where reg.account.username=:loggeduser",
   [loggeduser:loggeduser])

AccountRole.executeUpdate(
   "delete AccountRole as actrole where actrole.account.username=:loggeduser)",
   [loggeduser:loggeduser])

Account.executeUpdate(
   "delete Account as act where act.username=:loggeduser)",
   [loggeduser:loggeduser])               
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...