Groovy 加入的 createCriteria 问题 table

Groovy createCriteria issue with joined table

我有一个域 class Coach 与另一个域有很多关系 class CoachProperty.

Hibernate/Grails 正在数据库中创建第三个连接 table。

在下面的示例中,我试图获取文本值都具有 foo 和 bar 的教练。我在 Grails 中尝试了 'or' 和 'and' 的不同解决方案,其中 return 是一个空列表或同时包含 foo 和 bar 的列表。

教练:

class Coach {

static hasMany = [ coachProperties : CoachProperty ]

教练属性:

class CoachProperty {

String text
boolean active = true

static constraints = {
    
    text(unique: true, nullable: false, blank: false)
}
}

Joined table 这是自动创建的,我填充了一些数据,在这个例子中,我试图获取 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() 内以及其他过滤器中。这应该 return 教练 372 但 return 空:

def tempList = ["foo", "bar"]           
                    coachProperties{
                        for(String temp: tempList){
                            and {
                                log.info "temp = " + temp
                                ilike("text",temp)
                            }
                        }                       
                    }

我好像记得这个错误。是关于不能同时使用 nullable 和空白 time.Try 和 'nullable:true'

我必须使用 executeQuery 创建一个解决方法,其中 ids 是包含我试图获取的 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)
                        }
                    }