gpt4 book ai didi

grails - findAll order by "many to one"列引发异常

转载 作者:行者123 更新时间:2023-12-02 14:23:24 24 4
gpt4 key购买 nike

我有一个实体 Student,在 Student.groovy 中定义为:

@EqualsAndHashCode(includes = ['id'])
class Student {

Long id
String name
String type

University university

static mapping = {
university column : 'UNIVERSITY_ID'
}

}

和一个大学实体,在 University.groovy 中定义为:
class University {
Long id
String name

static mapping = {
id column : 'id', generator : 'assigned'
}
}

我一直在尝试从通话中切换
Student.list(sort: ..., order: ...)

打电话:
Student.findAll("from Student s where type = :type ", [type : 'T'], [ sort : 'name' ])

这无法按名称字段正确排序。以前的版本,使用 list工作正常。

我也试过调用像
Student.findAll(sort : 'name') { type == "T" }

像这样工作得很好,但是当试图按大学名称排序时
Student.findAll(sort : 'university.name') { type == 'T" }

它引发了关于未找到 university.name 字段的错误。

有人对如何正确执行此操作有任何想法吗?

谢谢你。

最佳答案

使用executeQuery而不是 findAll - 它们的功能应该相同,但我发现 executeQuery出于某种原因,它是 HQL 的更直接调用者,而 findAll在某些情况下失败或返回意外结果。

所以第一个查询是

Student.executeQuery(
'select s from Student s where s.type = :type order by s.name',
[type : 'T'])

并按大学名称排序
Student.executeQuery(
'select s from Student s where s.type = :type order by s.university.name',
[type : 'T'])

我喜欢 HQL 并且经常使用它,但是它将您与 Hibernate 和关系数据库结合在一起——如果您想切换到 NoSQL 数据库,这些查询将失败。条件查询、“where”查询和查找器都在内部使用条件查询,并且这些查询由 GORM 实现转换为原生查询 API 调用。

等效的标准查询将是
Student.withCriteria {
eq 'type', 'T'
order 'name', 'asc'
}


Student.withCriteria {
eq 'type', 'T'
university {
order 'name', 'desc'
}
}

一些不相​​关的注释:

你不应该使用 idequalshashCode计算;如果你有一个持久的 Student和一个具有相同名称、类型和大学的新非持久实例,它们应该被认为是相等的,但是由于非持久实例的 id 将为空,它们将被认为是不同的。

您无需指定 id属性 - Grails 添加它和 version在编译期间通过 AST 转换字段到字节码。

无需映射 university 的列名'UNIVERSITY_ID' 的属性——反正就是这样。

您可以省略多余的 column id 中的设置映射。

这是删除了 cruft 的 Student 类:
@EqualsAndHashCode(includes = ['name', 'type', 'university'])
class Student {
String name
String type
University university
}

和大学:
class University {
String name
static mapping = {
id generator: 'assigned'
}
}

关于grails - findAll order by "many to one"列引发异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27776118/

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