HQL - 直接查询连接表

时间:2014-12-09 13:46:40

标签: grails many-to-many hql

我正在编写一个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)

如果该项目的任务已经存在,我原本希望从数据库中获得重复的主键错误,但我没有收到任何关于此的通知。它只是无声地失败。

谢谢

2 个答案:

答案 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,我现在还记得。