2012-04-09 68 views
0

考虑下面的域模型:的Grails GORM的findAll返回null收集

class Sales{ 
    String salesInvoice 
    Customer customer 
} 

class Customer{ 
    int customerNumber 
    String name 
} 

的问题:我试图找回给客户的所有销售。因此代码:

def sales = Sales.findAllByCustomer(Customer.get(params.id)) 

我没有得到客户的问题。但是当我使用println sales.dump()我得到类似

<[email protected] elementData=[mypackage.Sales : null, mypackage.Sales : null] size=2 modCount=3> 

如果我理解正确的话,这意味着查询是能够得到的Sales清单,但我不太明白的是为什么它返回一个列表空?我尝试过急切的提取,但我不认为这会在这个特定问题中起作用。那么如何获取非空对象的列表?

+0

您正在使用哪个版本的Grails?也许你正在运行2.0.2中更改的数据绑定处理? – stefanglase 2012-04-09 12:33:37

+0

我仍然使用2.0.0。新的数据绑定更改如何影响我的代码?我是否必须使用其他语法或在某处添加其他配置? – 2012-04-09 12:56:06

+0

看看下面的博文描述的变化。 http://blog.springsource.org/2012/03/28/secure-data-binding-with-grails/这个特性在2.0.2中是默认的,但是在2.0.3中是非默认的,因为它是一个突破性的变化为许多生产代码。 – stefanglase 2012-04-12 15:01:52

回答

3

您显示的对象不为NULL,但对象的id当前为空:每个grails域对象都有一个toString()方法,该方法将打印${name of the class} : ${id of the instance}。如果您接收到输出,就像您所显示的那样,通常意味着您的实例已存在(否则将会抛出NPE!),但是该ID尚未从数据库中提取。

  1. 我想你是在代码之前创建的对象。您需要刷新上下文,否则不会创建id。
  2. 您应该声明,您的Sale属于Customerhttp://grails.org/doc/latest/guide/GORM.html#manyToOneAndOneToOne

顺便说一句:以单数命名你的域类。因此将Sales重命名为Sale

+0

你说得对。该列表不为空。我想Grails试图检索属性'id',但我的主键被命名为'salesInvoice'。 至于命名约定,我知道。有罪。 :) – 2012-04-09 23:37:20