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