Java Groovy createCriteria与联接表一起出现问题
我有一个域类Java Groovy createCriteria与联接表一起出现问题,java,hibernate,grails,groovy,hibernate-criteria,Java,Hibernate,Grails,Groovy,Hibernate Criteria,我有一个域类Coach,它与另一个域类CoachProperty有很多关系 Hibernate/Grails正在数据库中创建第三个联接表 在下面的例子中,我试图获取coach,它们的文本值都是foo和bar。我在Grails中尝试了使用“or”和“and”的不同解决方案,它们要么返回一个空列表,要么返回一个同时包含foo和bar的列表 教练: class Coach { static hasMany = [ coachProperties : CoachProperty ] CoachPro
Coach
,它与另一个域类CoachProperty
有很多关系
Hibernate/Grails正在数据库中创建第三个联接表
在下面的例子中,我试图获取coach,它们的文本值都是foo和bar。我在Grails中尝试了使用“or”和“and”的不同解决方案,它们要么返回一个空列表,要么返回一个同时包含foo和bar的列表
教练:
class Coach {
static hasMany = [ coachProperties : CoachProperty ]
CoachProperty:
class CoachProperty {
String text
boolean active = true
static constraints = {
text(unique: true, nullable: false, blank: false)
}
}
正在自动创建并填充一些数据的联接表,在本例中,我尝试获取coach 372,因为该coach同时具有1和2,即foo和bar:
+---------------------------+-------------------+
| coach_coach_properties_id | coach_property_id |
+---------------------------+-------------------+
| 150 | 2 |
| 372 | 1 |
| 372 | 2 |
| 40 | 3 |
+---------------------------+-------------------+
内部Coach.createCriteria().list()
以及其他筛选器。这将返回coach 372,但返回为空:
def tempList = ["foo", "bar"]
coachProperties{
for(String temp: tempList){
and {
log.info "temp = " + temp
ilike("text",temp)
}
}
}
我似乎记得这个错误。无法同时使用nullable和blank。请尝试使用'nullable:true'我必须使用executeQuery创建一个变通方法,其中id是包含我试图获取的coachproperties id的列表
def coaches = Coach.executeQuery '''
select coach from Coach as coach
join coach.coachProperties as props
where props.id in :ids
group by coach
having count(coach) = :count''', [ids: ids.collect { it.toLong()
}, count: ids.size().toLong()]
or{
coaches.each{
eq("id", it.id)
}
}
如果您消除
和{}
块,并添加一个或{}
块,而不是在和
块的同一位置,而是在coachProperties
块的外部,那么该方法是否有效?仍然返回空列表,还有其他想法吗@JeffScottBrown在作为参数传递给ilike
方法的temp
变量中没有通配符是故意的吗?通配符是什么意思?这是我问题的一个硬编码示例。真正的数据是从前端获取的ID列表,依赖于一些复选框有趣的是,上面简单的硬编码版本仍然给我错误的返回值aasd@JeffScottBrownI我尝试过只使用null,只使用blank,并将两者都删除。还是给我空名单。您是否可以检查您的解决方案?仍然停留在这个问题上@OrubelMy道歉。这是另一个错误。你似乎在CoachProperty没有“belongsTo”,你可能是对的,但我不明白这有什么关系。这会改变后台创建的sql查询吗?您不是在进行sql查询。您正在进行HQL查询。这就需要正确地连接域。通过添加belongsTo关系,意味着每个coachProperty只属于一个coach,这是错误的。每个coachProperty都可以属于*coach。