是否可以根据关系中父类的属性对查询结果进行排序。例如,我有一个用户域类,它与任务列表具有一对多关系。
当显示“任务”域类的列表页面时,我希望能够通过关联的“用户名”对任务列表进行排序。
class User {
String name
String login
String group
List tasks = new ArrayList()
static hasMany = [tasks:Task]
}
class Task {
String summary
String details
User user
static belongsTo = [user:User]
}
Run Code Online (Sandbox Code Playgroud)
我可以做这样的事情
Task.list([sort:"user", order:"asc"])
Run Code Online (Sandbox Code Playgroud)
但这是根据user.id进行排序的,是否有一种方法可以指定要在user.name上进行的排序?
以下域模型定义..
class Test {
String a
String b
static mapping = {
version(false)
table("test_table")
a(nullable: false)
b(nullable: true)
}
}
Run Code Online (Sandbox Code Playgroud)
..产生以下MySQL模式..
CREATE TABLE test_table (
id bigint(20) NOT NULL AUTO_INCREMENT,
a varchar(255) NOT NULL,
b varchar(255) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud)
请注意a并b获得相同的MySQL列定义,尽管事实a被定义为非可空,并且b在GORM映射中可以为空.
我究竟做错了什么?我正在运行Grails 1.3.6.
可以在Grails启动时将整个表加载到缓存中吗?
例如,我有一个2个表,每个表有5000条记录,用作静态只读数据.这个数据是最受欢迎的,因为其他表的所有信息都是从这个只读表中派生出来的.
我知道grails有一个缓存使用场景,但是这个信息会在很短的时间后不断从缓存中逐出,并且只会在下一个请求中重新缓存.
基本上是通过不必访问此静态数据的数据库来减少响应时间.
谢谢
def bid= Book.findAllBy(params.bname)
println(bid.id)
Run Code Online (Sandbox Code Playgroud)
我得到了结果 [58]
如何在没有报价的情况下获得价值?
如何将'bid'转换为整数?
我在grails应用程序中缓存了一些域实例和查询.我希望在第一次向db发出查询后,后续调用只会触发缓存.但是,我看到定期查询命中db(每5-6次后).同时没有数据更新/插入数据库.我正在使用p6spy检查所有记录的查询,并且看不到任何更新或插入.
我需要调整其他设置吗?
目前域类有
static mapping = {
cach true
}
Run Code Online (Sandbox Code Playgroud)
查询就好findBy*了[cache:true].
如何在Groovy/Gorm中正确编写此代码?
我有一个包含许多内容的PageComponent域类.我想看看特定的PageComponent是否包含具有特定键的内容.
我想我可以说:
def pageComponent = PageComponent.get(1);
if (pageComponent.contents.findByKey("textnode") {
// update
} else {
// insert
}
Run Code Online (Sandbox Code Playgroud)
目前,我正在使用它.不是很优雅......
def pageComponent = PageComponent.get(1);
def content = Content.withCriteria {
eq "pageComponent.id", pageComponent.id
eq "key", "textnode"
}
Run Code Online (Sandbox Code Playgroud) 我很难将域类对象保存到除默认dataSource之外的dbs中.应该说我可以从日志数据库中读取,但无法保存(UserLog.list()工作).当我运行应用程序时,保存UserLog对象会触发下面的错误.
DataSource.groovy的:
development {
dataSource {
dbCreate = "create-drop"
url="jdbc:postgresql://localhost:5432/db1"
username = "postgres"
password = "postgres"
driverClassName = "org.postgresql.Driver"
}
dataSource_log {
dbCreate = "update"
url="jdbc:postgresql://localhost:5432/db2"
username = "postgres"
password = "postgres"
driverClassName = "org.postgresql.Driver"
}
}
Run Code Online (Sandbox Code Playgroud)
log.UserLog:
class UserLog{
...
static mapping = {
id generator: "hilo"
version false
datasource 'log'
}
}
Run Code Online (Sandbox Code Playgroud)
CONF/BootStrap.groovy中:
import groovy.sql.Sql
import happyfloat.Address
import java.text.DateFormat
import java.text.SimpleDateFormat
import log.UserLog
class BootStrap {
def list = []
def dataSource_log
Random rand = new Random()
def …Run Code Online (Sandbox Code Playgroud) 我试图在本指南的帮助下在grails控制台中创建一个新的域对象.根据控制台输出,创建新对象:
grails> shell
groovy:000> new foo.Book(title: 'bar').save(failOnError: true, flush: true)
groovy:000> foo.Book : 1
groovy:000> foo.Book.list()
groovy:000> [foo.Book : 1]
Run Code Online (Sandbox Code Playgroud)
但是这个新书实体在dbconsole中是不可见的.当我连接到DataSource.groovy中的dev环境的JDBC url时,会出现表BOOK:
jdbc:h2:mem:devDb;MVCC=TRUE
username: sa
password: <blank>
Run Code Online (Sandbox Code Playgroud)
但是一个select返回0行
相关的DataSource.groovy配置(默认)
dataSource {
pooled = true
driverClassName = "org.h2.Driver"
username = "sa"
password = ""
}
hibernate {
cache.use_second_level_cache = true
cache.use_query_cache = false
cache.region.factory_class = 'net.sf.ehcache.hibernate.EhCacheRegionFactory' // Hibernate 3
// cache.region.factory_class = 'org.hibernate.cache.ehcache.EhCacheRegionFactory' // Hibernate 4
}
// environment specific settings
environments {
development {
dataSource {
dbCreate = …Run Code Online (Sandbox Code Playgroud) 我是grails应用程序的新工作.我对这个 - > grails中的运算符感到困惑.谁能给我一个明确的概念呢?或者给我任何关于这方面的参考资料对我来说很容易.我已经在阅读在线文档和一些书籍,但我仍然对此运算符和用法感到困惑.
我正在使用Grails 3.1.4,我创建了一些域对象和编写的单元测试.测试在我的计算机上执行正常.
但是在其他开发者计算机和连续集成平台上,测试失败,例外:
java.lang.IllegalStateException: Either class [ ] is not a domain class or GORM has not been initialized correctly or has already been shutdown. If you are unit testing your entities using the mocking APIs
at org.grails.datastore.gorm.GormEnhancer.stateException(GormEnhancer.groovy:159)
at org.grails.datastore.gorm.GormEnhancer.findValidationApi(GormEnhancer.groovy:173)
at org.grails.datastore.gorm.GormValidateable$Trait$Helper.currentGormValidationApi(GormValidateable.groovy:120)
at org.grails.datastore.gorm.GormValidateable$Trait$Helper.validate(GormValidateable.groovy:87)
at com.cscinfo.platform.constraint.CascadeValidationConstraint.validateValue(CascadeValidationConstraint.groovy:43)
at com.cscinfo.platform.constraint.CascadeValidationConstraint.processValidateWithVetoing_closure1(CascadeValidationConstraint.groovy:29)
at groovy.lang.Closure.call(Closure.java:426)
at com.cscinfo.platform.constraint.CascadeValidationConstraint.processValidateWithVetoing(CascadeValidationConstraint.groovy:28)
at grails.validation.AbstractVetoingConstraint.validateWithVetoing(AbstractVetoingConstraint.java:33)
at grails.validation.ConstrainedProperty.validate(ConstrainedProperty.java:967)
at org.grails.validation.GrailsDomainClassValidator.validatePropertyWithConstraint(GrailsDomainClassValidator.java:211)
at org.grails.validation.GrailsDomainClassValidator.validate(GrailsDomainClassValidator.java:81)
at org.grails.datastore.gorm.GormValidationApi.doValidate(GormValidationApi.groovy:89)
at org.grails.datastore.gorm.GormValidationApi.validate(GormValidationApi.groovy:161)
at org.grails.datastore.gorm.GormValidateable$Trait$Helper.validate(GormValidateable.groovy:87)
at api.mails.MailSpec.Test la validation d'un mail incorrect 2(MailSpec.groovy:66)
Run Code Online (Sandbox Code Playgroud)
似乎GORM无法获取我的域对象.
我无法在我的计算机上重现该错误.任何帮助或文档将不胜感激.谢谢 !