Hibernate JPA пустой результат с правильным запросом

Получение Hibernate возвращает пустой список, в то время как ожидается заполненный список. Вовлечение 2-х объектов, отображение по аннотациям:

@Entity
@Table(name = "parent")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
class Parent {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "ID")
    private long id;
}

@Entity
@Table(name = "child")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
class Child {
    @ManyToOne
    @JoinColumn(name = "parentId")
    @OrderBy(value="id")
    private Parent parent;
}

Выполненный запрос:

String queryString = "select c from Child c where c.parent.id = ?1";
Query q = getEntityManager().createQuery(queryString);
q.setParameter("1", parentId);
return q.getResultList();

Когда спящий режим выполняет этот набор кода, он возвращает список с размером = 0. Включение входа в систему SQL и выполнение запроса, представленного в журналах в MAMP, возвращает ожидаемый результат, у кого-нибудь есть идеи?


person Fico    schedule 01.10.2012    source источник


Ответы (3)


Это должно решить проблему:

q.setParameter(1, parentId);

В настоящее время вы вызываете Query.setParameter(String, Object), который предназначен для установки именованных параметров в запросе, но вы используете позиционный параметр в своем запросе. Изменение его на Query.setParameter(int, Object) установит позиционный параметр, и запрос будет работать.

person Abhinav Sarkar    schedule 01.10.2012
comment
Боюсь, что это не решает проблему, даже когда я изменяю запрос на что-то более простое, например: выберите c из дочернего элемента c, он по-прежнему возвращает пустой список: / Программно дочерняя база данных заполнена, поэтому это не проблема конфигурации или :/ - person Fico; 01.10.2012

Проблема возникла из-за управления транзакциями. Мы использовали @Transactional для Spring, чтобы указать, как управлять транзакциями. Но некоторые из наших транзакционных стратегий были неправильными.

Поэтому, кто когда-либо сталкивался с этой проблемой, должен включить ведение журнала транзакций, чтобы увидеть, фиксируются ли транзакции так, как вы от них ожидаете. Чтобы предотвратить доступ к данным из транзакции, которая еще не была зафиксирована.

person Fico    schedule 30.10.2012
comment
Не могли бы вы подробнее рассказать, что именно вы делали? Потому что я нахожусь в процессе транзакции. Но похоже, что запрос не использует транзакцию. - person Markus Barthlen; 03.04.2017

Вместо этого импорта:

import javax.persistence.Query

вы должны упомянуть об этом:

import org.hibernate.Query
person Sergii Shevchyk    schedule 01.10.2012