【问题标题】:Grails filter domain class by property of another domainGrails 按另一个域的属性过滤域类
【发布时间】:2013-10-02 05:35:55
【问题描述】:

我有一个 Grails 应用程序,想使用 named query 为我的域类创建过滤器。
我有域名ActStatusStatusNameEnum

class Act {
    static hasMany = [status : Status]
}

class Status {
    Date setDate
    StatusName name
    static belongsTo = [act : Act]
}

我想过滤其最近状态名称等于特定名称的行为。
现在我在Act中有这段代码:

static namedQueries = {
    filterOnStatus { StatusName s ->
        status {
            order('setDate', 'desc')
            eq 'name', s
            // I need only first Status, with most recent setDate
            // among all Statuses of that Act
        }
    }
}

但这会过滤所有具有特定名称状态的行为,而不仅仅是最近的行为。我试图将maxResult 1 放在查询中,但它似乎不起作用。
任何帮助将不胜感激。

编辑:问题就这样解决了:

filteronStatus {
    createAlias('status', 's1')
    eq 's1.name', s
    eq 's1.setDate', new DetachedCriteria(Status).build {
        projections {
            max('setDate')
            eqProperty('act', 's1.act')
        }
    }
}

【问题讨论】:

  • “最近的”是什么意思?您需要将日期添加到命名查询的参数中。如果setDate 大于该日期 - 状态在您的“最近”范围内。
  • Act 有几种状态。每个 Status 在设置时都有一个日期 (setDate)。最近的状态是指Status,在所有状态中最近的setDate

标签: grails hibernate-criteria named-query


【解决方案1】:

see 'namedQueries' from Grails Doc

// 获取单个最近的行为

def recentAct = Act.filterOnStatus(statusName).get()

添加:

HQL

"select s1.act from Status as s1 \
            where s1.name = :statusName \
            and s1.setDate = (select max(s0.setDate) from s1.act.status s0)"

命名查询

listByStatus { statusName ->
            createAlias('status', 's1')
            eq 's1.name', statusName
            eq 's1.setDate', new DetachedCriteria(Status).build{ projections { max('setDate')} eqProperty('act','s1.act') }
        }

【讨论】:

  • 我不需要一个最近的法案,我需要所有满足条件“该法案的最新状态的 StatusName 等于指定”的法案。你提供的代码给了我一个最新状态的法案。
  • def recentAct = Act.filterOnStatus(statusName)..listDistinct()
  • 尝试 def recentAct = Act.filterOnStatus(statusName).listDistinct()。无论如何,我建议使用模型:Act{ Status lastStatus };
  • 是的,我考虑将新字段添加到Act。但只有当我确定没有其他方法可以解决这个问题时,我才会这样做。而listDistinct()不是解决办法
猜你喜欢
  • 2014-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-11
  • 1970-01-01
  • 2012-07-06
  • 1970-01-01
相关资源
最近更新 更多