1

我一定很愚蠢,但我对使用 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();
}

最后更新 这一切都与模型有关:请参阅对这篇文章的评论。本质上,从逆向工程文件生成的模型是无效的,因为我没有真正唯一的密钥。一旦我解决了这个问题(受到此处评论的启发),一切都很好。

4

2 回答 2

1

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

于 2009-09-28T16:41:15.227 回答
1

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

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

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

于 2009-09-29T00:26:36.297 回答