【问题标题】:Hibernate JPA empty result with correct query具有正确查询的休眠 JPA 空结果
【发布时间】:2012-10-01 09:30:07
【问题描述】:

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();

当 hibernate 执行那组代码时,它会返回一个大小 = 0 的列表。打开 SQL 日志记录并执行 MAMP 中日志中提供的查询会返回预期的结果,任何人有什么想法吗?

【问题讨论】:

    标签: hibernate list jpa collections empty-list


    【解决方案1】:

    这应该可以解决问题:

    q.setParameter(1, parentId);
    

    目前您正在调用Query.setParameter(String, Object),它用于在查询中设置命名参数,但您在查询中使用了位置参数。将其更改为Query.setParameter(int, Object) 将设置位置参数并且查询将起作用。

    【讨论】:

    • 我担心这并不能解决问题,即使我将查询更改为简单的东西:“从子 c 中选择 c”它仍然返回一个空列表:/ 以编程方式的子数据库已满,因此也不是配置问题:/
    【解决方案2】:

    问题是由于事务管理引起的。 我们使用 @Transactional for Spring 来指示如何管理事务。但是我们的一些交易策略是错误的。

    因此,遇到此问题的人应该打开事务日志,以查看事务是否按照您期望的方式提交。防止您访问尚未提交的事务中的数据。

    【讨论】:

    • 你能详细说明你做了什么吗?因为我正在进行交易。但看起来查询没有使用事务。
    【解决方案3】:

    代替这个导入:

    import javax.persistence.Query
    

    你应该提到这个:

    import org.hibernate.Query
    

    【讨论】:

      猜你喜欢
      • 2015-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-20
      • 1970-01-01
      • 1970-01-01
      • 2017-06-22
      相关资源
      最近更新 更多