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

Hibernate retrieve возвращает пустой список, в то время как ожидается заполненный список. Вовлечение 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();

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

3 ответа

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

q.setParameter(1, parentId);

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

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

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

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

import javax.persistence.Query

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

import org.hibernate.Query
Другие вопросы по тегам