【问题标题】:HibernateTemplate findByExample returns no resultsHibernateTemplate findByExample 不返回任何结果
【发布时间】:2011-03-24 10:29:33
【问题描述】:

我正在尝试使用 Hibernate QBE(实际上是 Spring 的 HibernateTemplate.findByExample() )按用户名返回用户列表。我使用“已知良好”值进行搜索(用户名“JOHN.SMITH”确实存在于数据库中)。

很遗憾,我没有得到任何结果。下面是单元测试。

@Test
public void testQueryByExample() {

    User qbeUser = new User();
    qbeUser.setUsername("JOHN.SMITH");

    List<User> userList = userDao.queryByExample(qbeUser);
    Assert.notNull(userList);
    Assert.isTrue(userList.size() > 0, "List of returned users must not be 0");

}

queryByExample() 方法在通用 DAO 中定义:

@SuppressWarnings("unchecked")
public List<T> queryByExample(T obj) {
    return getHibernateTemplate().findByExample(obj);
}

QBE 是否需要任何特殊配置才能工作?

【问题讨论】:

  • 我同意@skaffman 的请求,启用 Hibernate SQL 日志记录肯定会有所帮助。

标签: java hibernate spring orm query-by-example


【解决方案1】:

这纯粹是我的愚蠢。

用作示例的类中有一些整数和布尔值(原语)。由于这些值默认为 0 和 false,因此查询失败。

【讨论】:

  • 是的,findByExample() 在其条件中包含所有原始属性,但忽略所有值为 null 的非原始属性。然而,Hibernate Example 类具有更灵活的标准选项。见docs.jboss.org/hibernate/stable/core/reference/en/html/…
  • 惊人的评论。我花了很长时间寻找合适的文档,但找不到。
【解决方案2】:

你必须传递spring配置文件否则它将如何获取连接和池信息..使用@注释在类声明上方加载spring文件。

【讨论】:

  • Test 类被注解@ContextConfiguration(locations = "classpath:applicationContext.xml") 被测类被成功注入。我其他不使用QBE的方法都很好,但是QBE不行。
【解决方案3】:

您可以通过调用在 Hibernate 的 Example 类中定义的 excludeZeroes() 方法来排除零值。将 hibernate.show_sql 属性添加到 hibernate.cfg.xml 文件将帮助您查看在 Hibernate 创建的 SQL 查询中哪些值设置为 0。 https://docs.jboss.org/hibernate/orm/5.4/javadocs/org/hibernate/criterion/Example.html#excludeZeroes--

【讨论】:

    【解决方案4】:

    将以下内容添加到您的 hibernate.cfg.xml 文件中:
    true

    运行您的应用程序。它将显示 Hibernate 生成的 SQL 查询。 通过查看 where 子句,您将看到哪些字段用于过滤。 Netbeans screenshot

    Criteria c = session.createCriteria(Parking.class);//deprecated since 5.2
    Parking p = new Parking();
    p.setCity("BROOKLYN");
    Example ex = Example.create(p);
    ex.excludeZeroes();   //exclude zero-valued properties
    c.add(ex);
    

    Hibernate Example 对象将使用 excludeZeroes() 方法排除零值属性。

    您可以使用 excludeProperty() 方法按名称排除某些属性,也可以使用 excludeNone() 方法排除任何内容。

    【讨论】:

      猜你喜欢
      • 2017-12-28
      • 2017-12-09
      • 2020-10-03
      • 2017-03-19
      • 2017-05-20
      • 2012-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多