Grails / Hibernate标准id inList

问题描述 投票:3回答:2

这个问题是基于我问here的问题。相同的关系和相同的目标。我有一个事实。我想获得与我所拥有的Thing实例相关联的Bar的所有实例相关联的所有Foo实例。

我的模型中有一个方法,它根据某些条件返回一个对象列表。

class Foo {

    static List findAllAssociatedWith( Object obj ) {
        def results = null
        if( obj instanceof Bar) {
            results = Foo.withCriteria() {
                bars{
                    //inList( "id", Thing.bars.id ) // this does not work
                    inList( "id", [new Long(3), new Long(4)] ) // this works
                }
            }
        }
        return results
    }
}

Thing.bars.id返回我要检查的id列表,但显然它是一个整数的ArrayList,即使Longs是预期的。这是我得到的错误:

java.util.ArrayList cannot be cast to java.lang.Long. Stacktrace follows:
Message: java.util.ArrayList cannot be cast to java.lang.Long

为什么Thing.bars.id返回整数列表而不是Longs列表,我该如何解决?

更新:

我在调用println Things.bars.id后发现了这个问题。我希望它返回一个数字的ArrayList(整数或长整数),如下所示:

[3,4]

但我获得了ArrayLists的ArrayList,其中第一个数组列表是我想要的,第二个数组列表是一个空列表,如下所示:

[ [ 3, 4 ], [] ]

不知道为什么Grails这样做,但现在简单的方法是Thing.bars.id.get( 0 )

hibernate grails groovy criteria
2个回答
1
投票

ubiquibacon,您可以使用flatten方法将数组数组展平为简单数组Thing.bars.id.flatten()

你的[[3,4],[]]变成了[3,4]


0
投票

没有看到Thing.bars的定义,很难说出这里发生了什么。但是,如果你有一个整数列表,你想变成Longs,你可以使用

Thing.bars.id*.asType(Long)
© www.soinside.com 2019 - 2024. All rights reserved.