虽然这些都没有具体说明,但它们可能会有所帮助:
http://grails.1312388.n4.nabble.com/How-can-I-get-the-column-name-that-a-property-maps-to-for-a-domain-class-td4633766.html
How to get the name of the table GORM object is mapped to?
我没有找到任何具体的东西,但这一切都很奇怪。我的意思是你已经知道了,我认为这是一些动态查询,否则你编码它会知道一起查询什么等等。
无论如何,作为一种解决方法,不确定是否可以,因为这取决于我们正在谈论的域类的数量,以及如果这是您已经实施或正在考虑写的东西,即如果可以的话,在这两种情况下都没有写将您自己的 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
}
您可以通过引用大写类名称及其方法,直接从任何地方调用该方法。
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):
def domainClass=Holders.grailsApplication?.domainClasses?.find { it.clazz.simpleName == tableName }?.clazz
如果你在控制器服务中声明 grailsApplication,或者没有 Holders:
def domainClass=grailsApplication?.domainClasses?.find { it.clazz.simpleName == tableName }?.clazz