在我正在研究的项目中(在Grails 2.5.4 / Hibernate 4.3中)我有一堆不同的类,使用了一些不同的dataSource。我需要确定两个给定的Class对象是否使用相同的dataSource。我想做的是:
Boolean doDataSourcesMatch(Class a, Class b)
{
return a.mapping.datasource == b.mapping.datasource
}
但当然这不起作用,因为a.mapping
是一个闭包。有谁知道如何访问类使用的dataSource?我不需要知道连接的任何属性,只需要知道两个类的查询是否会使用相同的连接。
非常感谢!
答案 0 :(得分:1)
虽然这些都没有具体说明,但它们可能有所帮助:
我还没有找到具体的东西,但这一切都很奇怪。我的意思是你已经知道了,我认为这是一些动态查询,否则你编码会知道要一起查询等等。
无论如何作为一种解决方法,不确定它是否可以,因为它取决于我们正在谈论多少个domainClasses,以及这是否已经存在或者正在考虑写入,即如果可以的话,在任何一种情况下都没有写入将您自己的getter添加到所有相关的域类
//
static String getDataSrc() {
return 'data_source_a'
}
//or
static boolean canQuery() {
return true/false
}
你可以从任何地方检查:
boolean canQuery = UserAttributes.canQuery()
String currentDataSource = UserAttributes.dataSrc
由于它们是静态方法,因此不需要实例化。这意味着如果你有
userObject(1)您不需要这样做:
User user = User.get(1)
if (user.canQuery()) {
// this is ok
}
您可以直接从任意位置调出方法通过引用upperCase类名及其方法。
String currentDataSource = UserAttributes.dataSrc
//Where this is exactly the same as above
String currentDataSource = UserAttributes.getDataSrc()
E2A:答案是:
import org.grails.orm.hibernate.cfg.GrailsDomainBinder
class TestController {
//either this method
def binder = new org.grails.orm.hibernate.cfg.GrailsDomainBinder().getMapping(Photos.class)
println "binder : ${binder.table.name}"
println "b: ${binder.datasources}"
//Or this
def dc=GrailsDomainBinder.getMapping(Photos.class)
println "-dc is ${dc}"
println "${dc.datasources}"
}
dc.datasources
是一个列表,因此您需要比较列表。
当然傻了,如果你在HQL中查询类似于动态表名的内容$ {tableA} $ {tableB}
您需要访问实际的域类才能调用GrailsDomainBinder
So something like:def domainClass = grailsApplication.getDomainClass(domain).clazz
会为您提供给定tableName的实际domainClass。但是您的域名必须是完全合格的打包名称,这样才会再次出现问题。
如果您查询com.domain.users.tableA
和com.domain.info.tableB
所以你可以改为使用If of service / controller):
def domainClass=Holders.grailsApplication?.domainClasses?.find { it.clazz.simpleName == tableName }?.clazz
如果您在控制器服务中声明grailsApplication,则或没有Holders:
def domainClass=grailsApplication?.domainClasses?.find { it.clazz.simpleName == tableName }?.clazz