首先,我需要为这篇冗长的帖子道歉,我为过于冗长但又不够清晰而苦苦挣扎。我还为我的问题广泛搜索了一个优雅的解决方案,如果我错过了它,请指导我。
一些背景:
我有一个 grails 应用程序,它使用 namedQueries 来获取一组标准结果集。该应用程序在我们的系统中找到公开的广告工作订单并将它们发送到其他网站。最近,如果我希望继续使用 namedQueries,一个额外的要求对我来说已经成为一个问题。
为了简单起见,让我们假设一个域模型
class JobOrder {
def getOpenAdJobsSql() {
def qry = "select jo FROM JobOrder jo WHERE isOpen=1 AND publishedTo='All External' AND adCategory.isActive=1 AND jo.adLocation in (select zc.id from Zip zc)"
JobOrder.executeQuery(qry)
}
static namedQueries = {
openAdJobs {
eq 'isOpen', true
eq 'publishedTo', "All External"
adCategory {
eq 'isActive', true
}
}
static mapping = {
table 'dbo.JOBORDER'
version false
id generator: 'identity', column: 'JOBORDERID'
isOpen column: 'ISOPEN'
publishedTo column: 'customText15'
adLocation column: 'PUBLISHEDZIP'
adCategory column: 'customInt3'
}
Boolean isOpen
String publishedTo
String adLocation
ClientCorporation client
AdCategory adCategory
static constraints = {
adLocation(size: 0..100)
}
}
class AdCategory {
static mapping = {
table 'dbo.AdCategory'
version false
id generator: 'identity', column: 'adCategory_ID'
isActive column: 'active'
}
}
class Zip {
static mapping = {
table 'ZIP'
version false
id generator: 'identity', column: 'ZIPCODE'
city column: 'city'
county column: 'county'
stateAbbr column: 'statecode'
}
String city
String county
String stateAbbr
}
我将从关注的当前 namedQuery 开始:
openAdJobs {
eq 'isOpen', true
eq 'publishedTo', "All External"
adCategory {
eq 'isActive', true
}
}
此查询存在于我的 JobOrder 域对象中,它也与 AdCategory 域对象有关系。使用以下调用在多个地方调用命名查询:
def openJobs = JobOrder.openAdJobs
我的新问题:
现在我需要确保不发布任何邮政编码无效的工作。我正在与不包含 zip 验证的产品集成,并且我无法控制产品的本机域模型。我们添加了一个独立的自定义 Zip 域对象。我一直在努力想办法在我的 JobOrder 对象中包含将与命名查询一起使用的代码,以完成以下查询将返回的内容:(我在 dbvisualizer 中针对 sql db 运行此查询)
select * from dbo.JobOrder jo
inner join dbo.AdCategory ac on jo.adCategory=ac.adCategory_ID
where
jo.isOpen=1
and
jo.publishedTo='All External'
and
ac.isActive=1
and
jo.publishedZip in (
select zc.zipcode from dbo.Zip zc
)
一个不太漂亮的解决方案:
我和几个同行获得所需结果集的唯一方法是在我的 JobOrder 对象中创建如下方法:
def getOpenAdJobsSql() {
def qry = "select jo FROM JobOrder jo WHERE isOpen=1 AND publishedTo='All External' AND adCategory.isActive=1 AND jo.adLocation in (select zc.id from Zip zc)"
JobOrder.executeQuery(qry)
}
当然,除非我实例化 JobOrder,否则该方法不可用。由于此时我实际上是在尝试构建我的 JobOrders 列表,因此有一个非常令人反感的 hack 来获取我的结果集。我需要获取一个已知良好的 JobOrder(或创建一个),以便可以调用 getOpenAdJobsSql() 方法。
就像是:
def jo = JobOrder.get(2)
def rset = jo.openAdJobsSql
需要在我当前调用openAdJobs命名查询的任何地方添加(当前有 9 个或更多用法)。甚至考虑这种方法都会给我发出心理警告,但我看不出有其他方法可以添加附加功能。
同样,最终我希望调用命名查询,但额外的邮政编码 sql 似乎是 GORM + hibernate 无法处理的。
我希望有人会知道一个更优雅的解决方案。并且请在这篇文章中缺少的任何地方要求澄清。