【问题标题】:Wizard-generated JPA DAO method doesn't return an iterable List向导生成的 JPA DAO 方法不返回可迭代列表
【发布时间】:2009-09-28 16:29:39
【问题描述】:

我一定很愚蠢,但我对使用 MyEclipse 7.5 的 JPA 问题束手无策。

我正在通过 JPA 访问一个 DB2 数据库(在 AS400 上)。我对一个简单的表进行了逆向工程,为 DAO 提供了一些精确的“查找”方法。到目前为止一切顺利。

如果我因此在表上运行 SELECT 语句,我会得到 4 行:

SELECT * FROM MyTable WHERE MyValue = '1234'

但是,如果我尝试通过 JPA 访问这 4 条相同的记录,我会得到一个大小合适的列表 (4),但其中包含 4 个完全相同的对象,即找到的第一个对象的所有副本:

List <MyTableObject> objects = dao.findByMyValue("1234");

几乎就好像 DAO 类创建的内部 Query 对象无法遍历数据行一样。我已经以多种方式调整了 reveng.xml 文件,并且我已经修改了生成的 DAO,但我一无所获。我在这里错过了一些非常明显的东西吗?我只是想以与常规 SELECT 语句返回结果集相同的方式获取对象列表!

(这是 MyEclipse 7.5,使用 Hibernate 3.2 及其关联的 JPA 库)。

更新:这是 findByMyValue() 传递给的生成代码(为清楚起见,删除了登录/尝试捕获):

    @SuppressWarnings("unchecked")
public List<PolicyStatFile> findByProperty(String propertyName, final Object value)
{
    final String queryString = "select model from MyTableObject model where model." + propertyName + "= :propertyValue";
    Query query = getEntityManager().createQuery(queryString);
    query.setParameter("propertyValue", value);
    return query.getResultList();
}

最终更新 一切都与模型有关:请参阅这篇文章的 cmets。本质上,从逆向工程文件生成的模型是无效的,因为我没有真正唯一的密钥。一旦我解决了这个问题(这里是由 cmets 推动的),一切都很好。

【问题讨论】:

  • 您能否发布findByMyValue() 方法的来源以及它使用的查询(如果有)?
  • 感谢您的回复!我已经用来源更新了原始帖子

标签: java jpa dao myeclipse


【解决方案1】:

您发布的方法看起来是正确的(尽管为所有属性生成此方法似乎毫无意义)。几件事情要检查:

  1. 您提到的 MyValue 属性是否直接映射到您的实体(例如,映射到同一张表上的列;不涉及关联)?
  2. 您能否启用 Hibernate SQL 调试(在您的配置中将“hibernate.show_sql”属性设置为 true)并检查生成的查询是什么样的?
  3. 返回的 4 个对象实际上是相同的(例如,彼此是 '==')还是它们是彼此的副本(例如,具有相同的属性值)?

您能否发布相关实体的映射并从上面的#2 生成 SQL?

【讨论】:

  • 你的第三点让我想到了真正独特的钥匙等。我通过识别基础表中的一些附加值来定位问题,这些值可以构建正确的唯一键。我调整了默认的 reveng 文件以使用它,嘿,很快,Hibernate 生成的数据模型现在按预期工作!感谢您的提示——感谢您花时间帮助一个白痴找到自己的路 ;-)
【解决方案2】:

我怀疑您没有在 JPA 实体(例如 MyTableObject)中覆盖 hashCode()equals()。所以 Hibernate 无法区分返回的行。那看看here

【讨论】:

  • 我完全没有想到,但那真的听起来是真的,谢谢!我将在这里检查并更新结果。感谢您的回复!
  • 这是不正确的。 hashCode() / equals() 对查询结果绝对没有影响。
  • 虽然在这种情况下 equals() 和 hashcode() 不是答案,但 R. Kettelerij 的回答让我想到了 reveng 文件中构建的复合键,我解决了我的问题 -默认 分组无效(不是真正唯一的键),因此 Hibernate 无法构建“正确”模型。谢谢你们!
猜你喜欢
  • 2010-11-02
  • 2015-07-23
  • 2022-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-22
相关资源
最近更新 更多