我正在使用带有投影的Criteria来获取我的帐户域中的标签列表.像这样:
def tags = Account.createCriteria().list {
projections { property("tags") }
}
Run Code Online (Sandbox Code Playgroud)
我的帐户域名:
class Account {
static mapWith = "mongo"
List<Tag> tags
...
static embedded = ['tags']
}
Run Code Online (Sandbox Code Playgroud)
BuildConfig.groovy
// using grails 2.3.8
plugins {
runtime ":hibernate:3.6.10.17"
compile ":mongodb:2.0.1"
Run Code Online (Sandbox Code Playgroud)
这一直有效,直到我将Grails的MongoDB GORM插件从2.0.1升级到3.0.1
compile ":mongodb:3.0.1"
Run Code Online (Sandbox Code Playgroud)
现在我看到以下错误......
The class [java.util.List] is not a known persistent type.
at org.grails.datastore.mapping.core.AbstractSession.retrieveAll(AbstractSession.java:723)
at org.grails.datastore.mapping.mongo.query.MongoQuery$AggregatedResultList.initializeFully(MongoQuery.java:1601)
at org.grails.datastore.mapping.mongo.query.MongoQuery$AggregatedResultList.size(MongoQuery.java:1764)
Run Code Online (Sandbox Code Playgroud)
为什么以前工作但现在失败了?我不想重写所有现有的查询来使用mongoDB的聚合框架.
问题是:在这个特定的例子中,如何使GORM生成左连接而不是内连接?
测试平台:
鉴于A,B和C类:
class A{
B someObject
}
class B{
C importantObject
}
class C{
boolean interestingFlag
}
Run Code Online (Sandbox Code Playgroud)
我想列出A类的所有元素:
到目前为止我尝试了什么:
这种方法产生正确的A列表,其中BC为空(条件2注释掉)或正确的A列表,其中BCinterestingFlag = false(无论条件1是否被注释掉).当两个条件都被取消注释时,它只返回ABCinterestingFlag = false的元素列表(ABC = null条件被忽略)
// approach 1 (conditional 1 is ignored)
def result = A.withCriteria{
someObject{
or{
isNull('importantObject') // conditional 1, works well when conditional 2 is commented out
importantObject{
eq('interestingFlag', false) // conditional 2, works well alone, discards conditional 1 when both of them are uncommented
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:根据评论中的要求我粘贴了一个hibernate生成的sql:
Hibernate: select this_.id …Run Code Online (Sandbox Code Playgroud) 我想在使用最新的Grails里程碑(2.0.0.M1)开发的应用程序中使用JPA域模型.JPA域类位于src\java应用程序的目录中.
基于这篇描述如何在Grails应用程序中使用现有JPA域模型的博客文章,我创建grails-app/conf/hibernate/hibernate.cfg.xml了一个带有JPA注释类的列表.
如果有人对自己想要运行应用程序感到厌倦,可以在这里找到它.运行应用程序时,启动时会发生以下错误
Error 2011-08-04 23:28:19,777 [Thread-8] ERROR context.GrailsContextLoader - Error executing bootstraps: Error creati
ng bean with name 'grailsDomainClassMappingContext': Instantiation of bean failed; nested exception is org.springframewo
rk.beans.BeanInstantiationException: Could not instantiate bean class [org.codehaus.groovy.grails.domain.GrailsDomainCla
ssMappingContext]: Constructor threw exception; nested exception is java.lang.NullPointerException
Line | Method
->> 303 | innerRun in java.util.concurrent.FutureTask$Sync
- - - - - - - - - - - - - - - - - - …Run Code Online (Sandbox Code Playgroud) 我有一个奇怪的问题.
我有两个域类User和Post字段:
class User {
String name
static hasMany = [posts: Post]
static constraints = { }
}
Run Code Online (Sandbox Code Playgroud)
和
class Post {
String content
long date = System.getTimeInMillis()
static constraints = { }
static belongsTo = [user: User]
static mapping = {
version: 'false'
}
}
Run Code Online (Sandbox Code Playgroud)
和控制器代码是:
class UserController {
def addUser = {
def user
if (User.count() == 0) {
user = new User()
user.name = "Manish Zedwal"
user.save(flush: true)
} else {
user = …Run Code Online (Sandbox Code Playgroud) 有没有办法dateCreated在不关闭自动时间戳的情况下覆盖域类中字段的值?
我需要测试控制器,我必须提供具有特定创建日期的特定域对象,但GORM似乎覆盖了我提供的值.
我的课程看起来像这样:
class Message {
String content
String title
User author
Date dateCreated
Date lastUpdated
static hasMany = [comments : Comment]
static constraints = {
content blank: false
author nullable: false
title nullable: false, blank: false
}
static mapping = {
tablePerHierarchy false
tablePerSubclass true
content type: "text"
sort dateCreated: 'desc'
}
}
class BlogMessage extends Message{
static belongsTo = [blog : Blog]
static constraints = {
blog nullable: false
}
}
Run Code Online (Sandbox Code Playgroud)
我正在使用控制台来缩短时间.当我写作时,我遇到的问题是Victor的方法:
Date someValidDate = …Run Code Online (Sandbox Code Playgroud) 我试图改变grails中的标准'id':
calls Book {
String id
String title
static mapping {
id generator:'assigned'
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,我很快发现这打破了我的自举.代替
new Book (id:'some ISBN', title:'great book').save(flush:true, failOnError:true)
Run Code Online (Sandbox Code Playgroud)
我不得不使用
def b = new Book(title:'great book')
b.id = 'some ISBN'
b.save(flush:true, failOnError:true)
Run Code Online (Sandbox Code Playgroud)
否则我会在调用save()'错误之前手动分配这个类的'ID.
但到目前为止还可以.
然后我在bookController的保存操作中遇到了同样的问题.但这一次,解决方法并没有成功.
有什么建议?
我知道,我可以重命名id,但之后我将不得不改变所有的脚手架视图......
假设我有一个grails域类,看起来像
class Person {
Address address
}
Run Code Online (Sandbox Code Playgroud)
我也可以声明它
class Person {
static hasOne = [address:Address]
}
Run Code Online (Sandbox Code Playgroud)
第二种方法是将外键移动到Address表而不是person表.
这种方式与另一种方式有什么实际的好处(或缺点)?据我所知,他们都会使用外键,这只是外键所在的问题.
是否可以使用GORM标准执行"in"标准.我正在寻找以下SQL的等价物
select * from Person where age in (20,21,22);
Run Code Online (Sandbox Code Playgroud)
如果有可能,我猜语法将是这样的:
def results = Person.withCriteria {
in "age", [20, 21, 22]
}
Run Code Online (Sandbox Code Playgroud) 如果我在Grails控制台中执行此代码:
def p = new Post(title: "T");
p.save(flush: true); // or p.save();
Post.count();
Run Code Online (Sandbox Code Playgroud)
GORM不会抛出任何异常,但数据不会保存在我的数据库中.我究竟做错了什么?
Grails 2.0似乎有一些变化DataSource.groovy,我似乎无法像在1.3.7中那样运行mysql
我做的grails install-dependency mysql:mysql-connector-java:5.1.16不仅仅是在lib中转储.jar.我听说这是现在这样做的方法.
以下是我在我的内容中所取代的内容DataSource.groovy:
driverClassName = "org.h2.Driver"
...
url = "jdbc:h2:mem:devDb;MVCC=TRUE"
Run Code Online (Sandbox Code Playgroud)
同
driverClassName = "com.mysql.jdbc.Driver"
...
url = "jdbc:mysql://localhost:3306/${dbNamer}?autoreconnect=true"
Run Code Online (Sandbox Code Playgroud)
当然将用户名,密码和dbNamer更改为有效条目...我做错了什么?是否有一个grails 2.0教程,涵盖了设置mysql?
我得到这个怪物错误:
| Loading Grails 2.0.0
| Configuring classpath.
| Environment set to development.....
| Packaging Grails application.....
| Compiling 1 source files.....
| Running Grails application
| Error 2012-01-16 21:39:10,134 [Thread-9] ERROR context.GrailsContextLoader - Error executing bootstraps: Error creating bean with name 'transactionManagerPostProcessor': Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: …Run Code Online (Sandbox Code Playgroud) grails ×10
grails-orm ×10
groovy ×2
criteria ×1
datasource ×1
foreign-keys ×1
gorm-mongodb ×1
grails-2.0 ×1
has-one ×1
hibernate ×1
java ×1
jpa ×1
mongodb ×1
mysql ×1
save ×1