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。