Идентификатор критерия Grails/Hibernate inList

Этот вопрос основан на вопросе, который я задал здесь. Те же отношения и та же цель. У меня есть экземпляр Thing. Я хочу получить все экземпляры Foo, связанные со всеми экземплярами Bar, которые связаны с имеющимся у меня экземпляром Thing.

У меня есть метод в моей модели, который возвращает список объектов на основе некоторых критериев.

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 возвращает список идентификаторов, которые я хочу проверить, но, по-видимому, это ArrayList из целых чисел, хотя ожидаются длинные. Это ошибка, которую я получаю:

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 возвращает список целых чисел вместо списка длинных и как это исправить?

ОБНОВЛЕНИЕ:

Я обнаружил проблему после звонка println Things.bars.id. Я ожидал, что он вернет ArrayList чисел (целые или длинные) следующим образом:

[3,4]

но вместо этого я получил ArrayList из ArrayLists, где первый список массивов был тем, что я хотел, а второй список массивов был пустым списком, например:

[ [ 3, 4 ], [] ]

Не уверен, почему Grails делает это, но на данный момент есть простой способ обойти это Thing.bars.id.get( 0 ).


person ubiquibacon    schedule 20.06.2012    source источник


Ответы (2)


ubiquibacon, вы можете сгладить свой массив массивов до простого массива, используя метод сглаживания Thing.bars.id.flatten()

ваш [ [ 3, 4 ], [] ] превращается в [3,4]

person Vss    schedule 13.03.2019

Не видя определения Thing.bars, трудно сказать, что здесь происходит. Однако, если у вас есть список целых чисел, которые вы хотите превратить в длинные, вы можете использовать

Thing.bars.id*.asType(Long)
person ataylor    schedule 20.06.2012
comment
Спасибо за быстрый ответ. Я задал аналогичный вопрос немного назад и обновил этот вопрос, добавив ссылку на мой предыдущий вопрос с графикой. - person ubiquibacon; 20.06.2012