Grails 2.2.5动态指定查询数据表问题求助
解决Grails 2.2.5动态根据表名(Domain类名)查询数据的问题
我来帮你搞定这个Grails 2.2.5的动态查询问题!先说说你之前两种方法为啥行不通,再给你适配版本的正确方案:
为啥之前的方法失败?
- 方法一:
params.tableName是个字符串类型的参数,它本身并没有findById方法,直接调用肯定会报方法不存在的错误——你得拿到对应的Domain类引用才能执行查询。 - 方法二:你从
grailsApplication.domainClasses拿到的是GrailsDomainClass对象,这是Grails对Domain类的包装类,不是实际的Domain类本身,所以它也没有findById静态方法,得获取它对应的实际类才行。
适配Grails 2.2.5的正确解决方案
方案1:通过全限定类名获取Domain类
如果你的params.tableName传入的是Domain类的全限定名(比如com.yourcompany.User),可以直接用grailsApplication.getDomainClass()方法快速获取:
// 获取传入的Domain类名参数 def targetDomainName = params.tableName // 从grailsApplication中获取对应的Domain类包装 def grailsDomainClass = grailsApplication.getDomainClass(targetDomainName) if (grailsDomainClass) { // 获取实际的Domain类(关键!之前的方法就是没这一步) def domainClass = grailsDomainClass.clazz // 执行查询 def result = domainClass.findById(100) // 这里可以处理查询结果,比如返回给前端或者做后续逻辑 } else { // 处理找不到对应Domain类的情况 println "找不到名为${targetDomainName}的Domain类,请检查参数是否正确" }
方案2:通过短类名匹配Domain类
如果你的params.tableName传入的是短类名(比如User而不是全限定名),可以遍历grailsApplication.domainClasses来匹配:
def targetShortName = params.tableName // 遍历所有Domain类,找到短名匹配的,然后拿到实际类 def domainClass = grailsApplication.domainClasses.find { it.shortName == targetShortName }?.clazz if (domainClass) { def result = domainClass.findById(100) // 处理结果 } else { println "找不到短名为${targetShortName}的Domain类,请检查参数" }
注意事项
- 一定要做参数校验:防止传入不存在的类名或者恶意参数,避免空指针或者异常。
- 确保Domain类已经被Grails正确加载:如果是自定义的Domain类,要放在
grails-app/domain目录下,或者已经被配置到Grails的扫描路径中。
内容的提问来源于stack exchange,提问作者SeriousLee
相关产品推荐
相关产品推荐

