HQL查询和连接有两个单向关系

时间:2013-12-09 14:36:38

标签: select join hql where-clause

请帮助您解决以下问题:

我的课程如下:

class MasterAssociation {
    String name    
    Survey survey // can be null
    Object other
    // Lots of other attributes
}

class Survey {
    String name
    // Lots of other attributes
}

class SurveyQuestion {
    String name
    QuestionType type
    Survey survey
    // Lots of other attributes
}

(由于各种原因,上述关系只能是单向的。)

我有一种方法需要根据各种标准返回选定的MasterAssociations。我所拥有的新标准是仅返回具有包含特定问题类型的调查的MasterAssociations。现有的代码都是基于HQL的,所以我想保留它(我知道SQL中的解决方案,但不是真的想转换所有现有的代码,也不是为这种情况创建一个特殊的方法)。

我该如何做? (这是伪代码)

select MasterAssociation ma

// lots of existing code using different flags to construct query
// based on name, etc.

if (newSpecialFlag) {
    where ma.survey is not null
    and where ma.survey has SurveyQuestion.type = QuestionType.XYZ
}

我真的很感激任何帮助。

感谢。

1 个答案:

答案 0 :(得分:0)

我想我已经弄明白了(下面有一些Groovy语法,但它应该仍然可读)

我在其他地方读过有关修改原始from子句以包含次要对象的内容,即使实际的select没有选择它。

答案:

String hql = "select ma from MasterAssociation as ma"

if (newSpecialFlag) {
    hql += ", SurveyQuestion as sq "
    criteria += " AND sq.type = " + QuestionType.XYZ
    criteria += " AND ma.survey.id in (sq.survey.id) "
}