以下代码适用于 MySQL .
但切换 HSQLDB in-memory database (单元测试)时,相同的代码失败,
查询查询= entityManager.createQuery(“SELECT c FROM CartInvoiceEntity c WHERE c.invoiceId =:invoiceId”); query.setParameter(“invoiceId”,cartInvoiceEntity.getInvoiceId());
以下错误消息:
org.hibernate.QueryParameterException: could not locate named parameter [invoiceId]
在调试时检查查询对象,我发现查询对象有一个参数字段 . 使用MySQL时,此参数在其HashMap中包含“invoiceId” . 但是当切换到HSQLDB时,这个HashMap是空的 - 这就是抛出异常的原因 . 问题是为什么HashMap在使用HSQLDB时是空的 .
以下是相关的Maven依赖项
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.1.9.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>4.1.9.Final</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.16</version>
</dependency>
<dependency>
<groupId>hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<version>1.8.0.10</version>
<scope>test</scope>
</dependency>
从依赖层次结构中,我可以看到hibernate-jpa-2.0.api:1.0.1.Final被使用,它是从hibernate-core和hibernate-entitymanager JAR间接引用的 .
任何帮助都非常感谢!
1 回答
刚刚找到了根本原因 . 在进行单元测试时(不一定有或没有内存数据库,如HSQLDB),不知何故,Spring组件扫描机制对JPA持久性设置无法正常工作 . 这会导致Hibernate在查找参数时失败 . 如果Hibernate知道实体类,它只查找参数 .
我的修复是直接 add class entries (for entity classes) into persistence.xml (在创建EntityManagerFactory时不知道如何在org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean中执行此操作) .
看到:
但我确实遇到了一些其他问题,这是由HSQLDB本身引起的,如下所示 .
升级HSQLDB的版本已解决此问题 . 请参阅以下stackoverflow链接:
谢谢 .