Как я могу сделать именованный запрос с IN на самом деле работать? - PullRequest
3 голосов
/ 15 июня 2011
class X {
Y y; // manyToOne
}
class Y {
Long id;
}


@NamedQuery(name = "someName", query = "from X where y.id in :ids")

У меня есть публичные, таблицы, сущности и все другие вещи на сущностях, но я их здесь не писал.

TypedQuery<X> query = getEntityManager().createNamedQuery("someName", X.class);
query.setParameter("ids", someListOfLongs); // HERE I GET THE ERROR
queryFinal.getResultList();


Parameter value [[Ljava.lang.Object;@90d0bf] was not matching type [java.lang.Long]

Я пытался с или без (), я изменил версию Hibernate-Core на 3.6.4 (с JBoss 6.0.0.Final), в противном случае, если я написал in :ids без() Я получил ошибку.

Пожалуйста, помогите.


The IN always worked, the problem was that List<Long> wasn't actually List<Long> was List<Object[]>. Thanks

Ответы [ 2 ]

5 голосов
/ 15 июня 2011

Я также использую JBoss AS 6 и эту точную конструкцию, но она просто работает.

Это пример запроса:

<named-query name="Item.getByItemIDs">
    <query>
        SELECT
            i
        FROM
            Item i
        WHERE
            i.ID in (:itemsIDs)
    </query>
</named-query>

И класса, использующего его:

@Override
public List<Item> getByItemIDs(List<Long> itemIDs) {
    return entityManager.createNamedQuery("Item.getByItemIDs", Item.class)
                        .setParameter("itemIDs", itemIDs)
                        .getResultList();
}

Поскольку в вашем исключении указано [[Ljava.lang.Object;@90d0bf] (что является объектом []), может быть, вам следует попробовать List , как в моем примере?

(p.s. Вы можете использовать API API JPA, чтобы сделать ваш код немного менее подробным)

1 голос
/ 15 июня 2011

Предложение 'IN' в hibernate: очень , очень сложно, и, насколько я помню, не очень хорошо работает с именованными параметрами, но с позиционными параметрами.

Попробуйте изменить запрос на этот

@NamedQuery(name = "someName", query = "select x from X x where x.y.id in (?)")

и код, который его использует, на

TypedQuery<X> query = getEntityManager().createNamedQuery("someName", X.class);
query.setParameter(1, someListOfLongs); // I can't remember if the position is 0 or 1 based.
queryFinal.getResultList();

И я должен добавить, что если список будет emtpy, вы 'Я получу исключение.В нашем коде мы обнаруживаем эту ситуацию и заменяем пустой список списком, который содержит «-1», и, поскольку все идентификаторы положительны, мы не получаем никаких результатов обратно.

...