我正在编写一个HQL查询来检查Grails中多对多关系的连接表中是否存在特定的对。
SQL很简单:
SELECT count(*)
FROM [ProjectCalculator].[dbo].[task_project]
WHERE task_id=[task_id] AND project_id=[project_id]
代码:
class Project {
String title
...
static belongsTo = [Task, Modifier]
static hasMany = [tasks:Task, modifiers : Modifier]
...
}
class Task {
String description
static hasMany = [project:Project]
...
}
我无法弄清楚如何为此编写HQL,因此它与数据库无关。
这个问题的原因是当我向项目添加现有任务时,我没有收到任何错误:
例如: projectInstance.addToTasks(task).save(flush:true)
如果该项目的任务已经存在,我原本希望从数据库中获得重复的主键错误,但我没有收到任何关于此的通知。它只是无声地失败。
谢谢
答案 0 :(得分:0)
你可以传递param" failOnError:true"抛出ValidationException。不知道它是否捕获了SQLException。避风港没试过。 您还可以在DataSource.groovy中设置logSql = true以在控制台中打印查询。 希望这会有所帮助。
答案 1 :(得分:0)
你不应该查询连接表,即SQL-way而不是Hibernate方式。 您可能遇到的问题与hibernate / grom中的多对多关系有关。
将静态mappedBy = [project: "none"]
添加到Task
类(如果您使用的是持久性数据库,则生成/运行迁移),这应该可以解决您的问题并且您应该能够做到
projectInstance.addToTasks(task).save(flush:true)
如果在这种情况下还需要mappedBy = [tasks: "none"]
类Proyect
,我现在还记得。