Grails GORM:查询是否存在拥有汽车的Person(关联表非空判断)
判断Person与Car关联表是否存在记录的几种方法
针对你给出的Grails GORM实体定义(多对多关联生成person_cars中间表),要判断是否存在拥有汽车的Person对象(也就是中间表是否有记录),这里有几种实用的实现方式:
方法一:使用GORM条件查询的exists方法(最简洁)
利用GORM的动态查询能力,直接检查是否存在关联了Car的Person:boolean hasAssociatedPersons = Person.where { cars.isNotEmpty() }.exists()这个查询会自动生成高效的SQL,判断
person_cars表是否存在记录,不需要加载完整实体,性能表现不错。方法二:直接查询中间表(最高效)
如果想直接操作中间表,用原生SQL查询是最直接的方式,完全跳过ORM层的额外处理:// 方式1:通过Hibernate Session执行原生SQL boolean hasAssociatedPersons = Person.withSession { session -> session.createSQLQuery("SELECT EXISTS(SELECT 1 FROM person_cars)").uniqueResult() as boolean } // 方式2:使用Groovy Sql类(需要注入或获取Sql实例) import groovy.sql.Sql def sql = new Sql(dataSource) // dataSource可通过依赖注入获取 boolean hasAssociatedPersons = sql.rows("SELECT 1 FROM person_cars LIMIT 1").size() > 0这种方式直接检查中间表是否有数据,是性能最优的方案。
方法三:使用HQL查询
如果你习惯用HQL,也可以通过关联查询来判断:boolean hasAssociatedPersons = Person.executeQuery( "SELECT EXISTS(SELECT 1 FROM Person p JOIN p.cars c)" )[0] as boolean或者用SIZE函数判断Person的cars集合是否非空:
boolean hasAssociatedPersons = Person.executeQuery( "SELECT COUNT(*) > 0 FROM Person p WHERE SIZE(p.cars) > 0" )[0] as boolean
另外提个小细节:你的实体里手动定义了int id,其实Grails GORM默认会自动生成主键字段(默认是Long类型的id),除非有特殊业务需求,否则可以去掉手动定义的id,避免潜在的类型或主键生成策略冲突问题。
内容的提问来源于stack exchange,提问作者dre
相关产品推荐
相关产品推荐

