gpt4 book ai didi

mysql - 调用存储函数的派生属性抛出 StreamCorruptedException

转载 作者:行者123 更新时间:2023-11-29 21:52:10 25 4
gpt4 key购买 nike

我试图通过用派生字段替换动态字段(没有底层数据库表示的 transient getter)来提高性能,以便我可以使用 Criteria 等来查询我的模型。最初的动态字段非常简单:

Client resolveClient() {
if (prevCall && prevCall.client) {
return prevCall.client
} else {
return client
}
}

我不知道如何用单个 MySQL 语句重现它,所以我想我应该继续将其粘贴到一个存储函数中,定义如下:

CREATE FUNCTION `request_client`(requestId long) RETURNS varchar(255) CHARSET utf8
begin
declare pci long;
declare clientId long;
declare clientName varchar(255);

select request.prev_call_id
from request
where request.id = requestId
into pci;

if pci is not null then
select call_history.client_id
from call_history
where call_history.call_id = pci
into clientId;
else
select request.client_id
from request
where request.id = requestId
into clientId;
end if;

select clients.client_name
from clients
where clients.client_id = clientId
into clientName;

return clientName;

end;

然后我在派生字段中调用该函数:

String derivedFieldName
static mapping = {
derivedFieldName formula: '(select stored_function(id))'
}

问题是,现在当我在域上运行任何查询时,即使像 Request.list() 这样简单,我也会收到以下异常:

类: java.io.StreamCorruptedException
消息:无效的流 header :32303135

为了额外的乐趣,这是一个抽象域类。我不知道这是否真的有什么区别;它仍然像任何其他域一样持久保存到数据库,并且我在抽象类本身而不是实现上调用查询。

最令人沮丧的是,派生字段本身确实有效!我可以使用它成功检索客户名称;我只是无法查询整个域。

最后,我非常有信心派生属性是问题所在,因为我已将其注释掉,然后可以成功查询域。

最佳答案

如果以后有人遇到这个问题,问题实际上是抽象类。不仅仅是它是一个抽象类——它还是一个抽象类。显然,Grails 不支持这些派生属性。

要将查询移至数据库,我只需开始将已解析的客户端保存到我的请求域中:/

关于mysql - 调用存储函数的派生属性抛出 StreamCorruptedException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33533630/

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