gpt4 book ai didi

grails - 可以使用Grails的派生属性检索域对象吗?

转载 作者:行者123 更新时间:2023-12-02 15:49:51 25 4
gpt4 key购买 nike

我有一个RequestRequestSet(一个用户同时提交的单个请求的集合)和一个请求Status的域类。我想汇总请求的状态,以便请求集的状态由其各个请求的状态确定。

这些域类的相关部分如下所示:

class RequestSet {
Long id
static hasMany = [requests: Request]
}

class Request {
Long id
Status status
}

class Status {
Long id
String status
}

我尝试将派生的 status属性添加到 RequestSet类,如下所示:
class RequestSet {
Long id
Status status
static hasMany = [requests: Request]

static transients = ['status']

static mapping = {
status formula: '(SELECT MIN(status_id) FROM (SELECT status_id FROM request rq WHERE rq.request_set_id = id))'
}
}

但是,当我运行我的应用程序并检查requestSet对象的属性时,状态均为null。

我正在尝试使用派生属性来完成什么?我可以使用getter来满足 transient 属性的要求,但我希望能够使用动态查找器根据其冒泡状态来检索requestSet。我看过的所有示例都按原样使用公式的结果;我想知道是否可以通过某种方式让Grails将返回的值解释为 Status类的ID。

编辑,2016年12月7日:请注意,我将派生的 status属性标记为 transient 。没有这样做,我从Hibernate获取了 ClassCastException
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManagerPostProcessor': Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager': Cannot resolve reference to bean 'transactionManager_companion' while setting constructor argument with key [1]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager_companion': Cannot resolve reference to bean 'sessionFactory_companion' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory_companion': Invocation of init method failed; nested exception is java.lang.ClassCastException: org.hibernate.mapping.Formula cannot be cast to org.hibernate.mapping.Column
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)

我怀疑即使公式起作用,我也无法使用带有此属性的动态查找器,因为它被标记为 transient 。我将解决使用公式来计算状态ID的问题,但是仍然存在问题。

现在,我的域类如下所示:
class RequestSet {
Long id
Long statusId
static hasMany = [requests: Request]

static mapping = {
statusId formula: '(SELECT MIN(status_id) FROM (SELECT rq.status_id FROM request rq WHERE rq.request_set_id = id))'
}
}

由公式在提取请求集时生成的SQL为
(SELECT MIN(this_.status_id) FROM (SELECT rq.status_id FROM request rq WHERE rq.request_set_id = this_.id)) as formula3_0_ from request_set

我得到一个 SQLSyntaxErrorException: ORA-00904: "THIS_"."STATUS_ID": invalid identifier。我该如何重写公式,以便“this_”。不是在status_id之前?

最佳答案

回答我的原始问题,不,您不能使用公式派生另一个域类的属性。我多次尝试失败,使我得出了这个结论,this blog的作者似乎也这么认为。具体来说,“派生的属性可以是Hibernate支持的任何类型”,而我的Status类则不是。

至于我的后续问题,根据this answer for a different question,HQL不支持我使用的公式。我设法使用以下公式将statusId作为派生属性获取:

(SELECT MIN(status.id) FROM status WHERE status.id IN (SELECT rq.status_id FROM request rq WHERE rq.request_set_id = id))

感谢@Mike提出的打开SQL日志记录的建议。这确实有助于弄清楚发生了什么。

关于grails - 可以使用Grails的派生属性检索域对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41006951/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com