标签: grails-orm

升级Grails MongoDB GORM打破了列表属性的预测

我正在使用带有投影的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的聚合框架.

grails grails-orm mongodb gorm-mongodb

23
推荐指数
1
解决办法
511
查看次数

默认情况下,条件使用"内连接"而不是"左连接"方法,使我的查询工作不符合我的计划

问题是:在这个特定的例子中,如何使GORM生成左连接而不是内连接?

测试平台:

鉴于A,B和C类:

class A{
    B someObject
}

class B{
    C importantObject
}

class C{
    boolean interestingFlag
}
Run Code Online (Sandbox Code Playgroud)

我想列出A类的所有元素:

  • 他们的BC对象为空OR
  • 他们的BC对象interestingFlag值是假的

到目前为止我尝试了什么:

这种方法产生正确的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 grails-orm

22
推荐指数
2
解决办法
2万
查看次数

在Grails中使用JPA域类

我想在使用最新的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)

java grails groovy jpa grails-orm

21
推荐指数
1
解决办法
2311
查看次数

为什么grails在第一次访问hasMany关系时抛出空指针异常?

我有一个奇怪的问题.
我有两个域类UserPost字段:

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)

grails grails-orm

20
推荐指数
2
解决办法
1万
查看次数

覆盖dateCreated以在Grails中进行测试

有没有办法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 save grails-orm

19
推荐指数
5
解决办法
5208
查看次数

我自己在GORM中的身份

我试图改变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 grails-orm

19
推荐指数
2
解决办法
9705
查看次数

grails hasOne vs direct成员变量

假设我有一个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表.

这种方式与另一种方式有什么实际的好处(或缺点)?据我所知,他们都会使用外键,这只是外键所在的问题.

grails foreign-keys grails-orm has-one

19
推荐指数
4
解决办法
6829
查看次数

Grails/GORM"in"标准

是否可以使用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 hibernate criteria grails-orm

18
推荐指数
1
解决办法
2万
查看次数

为什么GORM没有保存我的对象?

如果我在Grails控制台中执行此代码:

def p = new Post(title: "T");
p.save(flush: true); // or p.save();

Post.count();
Run Code Online (Sandbox Code Playgroud)

GORM不会抛出任何异常,但数据不会保存在我的数据库中.我究竟做错了什么?

grails groovy grails-orm

18
推荐指数
2
解决办法
2万
查看次数

如何使MySQL在grails 2.0上运行

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)

mysql grails datasource grails-orm grails-2.0

17
推荐指数
2
解决办法
2万
查看次数