如何解释使用 Hibernate 查询的这种行为?是因为 Hibernate 懒惰吗?
How can this behaviour using a Hibernate query be explained? Is it due to Hibernate lazyness?
今天早上,我 运行 出现了一种我无法真正解释的行为:当我试图在 GORM 的帮助下保存(或检索它是否已经存在)一些对象时,我对 NullPointerException
当一个对象(名称为 "name3")只是从数据库中检索并存储在 List
中并随后读取为 null
时。令我惊讶的是,当我将这个对象存储在一个 def
变量(或者我猜不是集合的任何东西)中时,异常消失了。
这里是一个示例代码(顺便一开始数据库是空的)
// A simple domain class :
class MyDomainClass {
String name
}
//In the PluginClass where i initialize some pieces of data :
def doWithApplicationContext = { ctx ->
MyDomainClass.withNewSession {
def myDomainObjectsNames = ["name1","name2"]
def myDomainObjectsList = []
myDomainObjectsNames.each { name ->
def myDomainObject = MyDomainClass.findByName(name) ?: new MyDomainClass(name: name).save(failOnError: true)
myDomainObjectsList.add(myDomainObject)
}
myDomainObjectsList.each { println("object : " + it.toString())}
myDomainObjectsNames = ["name3","name2"]
myDomainObjectsList = []
myDomainObjectsNames.each { name ->
myDomainObjectsList << MyDomainClass.findByName(name) ?: new MyDomainClass(name: name).save(failOnError: true)
}
myDomainObjectsList.each { println("object : " + it.toString())}
}
}
代码输出:
object : mypackage.MyDomainClass : 1
object : mypackage.MyDomainClass : 2
object : null // Can't explain
object : mypackage.MyDomainClass : 2
会不会是Hibernate懒惰的缘故?或者 Groovy 动态类型?我不确定。
谢谢!
不是局部变量,而是precendence of <<
vs ?:
。你的第二个循环首先将 findBy
的结果添加到列表中。
def list = []
list << null ?: 666
assert list.first()==null
今天早上,我 运行 出现了一种我无法真正解释的行为:当我试图在 GORM 的帮助下保存(或检索它是否已经存在)一些对象时,我对 NullPointerException
当一个对象(名称为 "name3")只是从数据库中检索并存储在 List
中并随后读取为 null
时。令我惊讶的是,当我将这个对象存储在一个 def
变量(或者我猜不是集合的任何东西)中时,异常消失了。
这里是一个示例代码(顺便一开始数据库是空的)
// A simple domain class :
class MyDomainClass {
String name
}
//In the PluginClass where i initialize some pieces of data :
def doWithApplicationContext = { ctx ->
MyDomainClass.withNewSession {
def myDomainObjectsNames = ["name1","name2"]
def myDomainObjectsList = []
myDomainObjectsNames.each { name ->
def myDomainObject = MyDomainClass.findByName(name) ?: new MyDomainClass(name: name).save(failOnError: true)
myDomainObjectsList.add(myDomainObject)
}
myDomainObjectsList.each { println("object : " + it.toString())}
myDomainObjectsNames = ["name3","name2"]
myDomainObjectsList = []
myDomainObjectsNames.each { name ->
myDomainObjectsList << MyDomainClass.findByName(name) ?: new MyDomainClass(name: name).save(failOnError: true)
}
myDomainObjectsList.each { println("object : " + it.toString())}
}
}
代码输出:
object : mypackage.MyDomainClass : 1
object : mypackage.MyDomainClass : 2
object : null // Can't explain
object : mypackage.MyDomainClass : 2
会不会是Hibernate懒惰的缘故?或者 Groovy 动态类型?我不确定。 谢谢!
不是局部变量,而是precendence of <<
vs ?:
。你的第二个循环首先将 findBy
的结果添加到列表中。
def list = []
list << null ?: 666
assert list.first()==null