我的项目中有很多域类。其中许多都有类型列。例如:User
表有userType
列,Book
表有bookType
列。我经常通过调用BookType.list()
方法将这些类型传递到 GSP g:select
源中。但问题是,如果 GSP 包含大量g:select
那么我必须执行大量冗余查询。
另一个问题是,当我创建一个新的域实例时,我必须通过以下方式从DB获取这些常量类型
Book book = new Book();
book.bookType = BookType.findByName(BookTypes.COMICS);
在这里我也有同样的问题,我必须执行冗余查询。有没有好的设计可以在不执行这些冗余查询的情况下完成所有这些工作?
如果types
不是很随意,我假设是这种情况,因为我可以看到你为类型定义了enum
。尝试使用enum
,完全 - 我的意思是,根本不用数据库表来备份它。例如
enum SomeType {
TYPE1(1, "Type 1"),
TYPE2(2, "Type 2"),
TYPE3(3, "Type 3")
final int id
final String value
private SomeType(int id, String value) {
this.id = id
this.value = value
}
// Might be needed for <g:select> tags, I'm not very sure
int getKey() { id }
static SomeType byId(int id) {
values().find { it.id == id }
}
}
然后,在您的域中,执行以下操作:
class SomeDomain {
static constraints = {
...
type nullable: false
...
}
...
SomeType type
}
然后,你可以简单地做这样的事情,
SomeDomain book = new SomeDomain(..., type: SomeType.TYPE1, ...);