我通过hibernate-envers库配置了审计,它工作正常,直到我想通过AuditReader API读取历史记录。
这是代码:
AuditReader auditReader = AuditReaderFactory.get(entityManager);
List<Number> revisionNumbers = auditReader.getRevisions(Queue.class, queue.getId());
for (Number rev : revisionNumbers) {
Queue auditedQueue = auditReader.find(Queue.class, queue.getId(), rev);
audQueues.add(auditedQueue);
}
抛出的异常是 org.postgresql.util.PSQLException:错误:运算符不存在:smallint&lt;&gt; BYTEA 提示:没有运算符匹配给定的名称和参数类型。您可能需要添加显式类型转换。 职位:879
我配置了sql日志记录,我看到了失败的查询:
select queue_aud0_.ID as ID12_, queue_aud0_.REV as REV12_, queue_aud0_.REVTYPE as REVTYPE12_ from CMSMS_QUEUE_AUD queue_aud0_ where (queue_aud0_.REV=(select max(queue_aud1_.REV) from CMSMS_QUEUE_AUD queue_aud1_ where (queue_aud1_.REV<=? )and(queue_aud0_.ID=queue_aud1_.ID )))and(queue_aud0_.REVTYPE<>? )and(queue_aud0_.ID=? )
选择了更多的列,但它们现在并不重要... hibernate使用的参数是:
bindNamedParameters() TEST_NEW -> _p1 [3]
bindNamedParameters() DEL -> _p0 [2]
bindNamedParameters() 5 -> revision [1]
我尝试使用这些参数运行查询,并抛出相同的异常。原因是第二个参数 queue_aud0_.REVTYPE&lt;&gt;?,因为hibernate试图设置'DEL'字符串,而REVTYPE是smallint。这很奇怪,因为这些表是由hibernate自动生成的......任何想法为什么会这样做?
我使用版本4.2.0.Final
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-envers</artifactId>
<version>4.2.0.Final</version>
</dependency>
答案 0 :(得分:0)
在玩了一些依赖项之后,现在可以正常工作了。我将Hibernate切换到5.3.0.Final和SpringFramework到5.0.5.RELEASE。还删除了一些冗余的JPA依赖项。不能确切地说,是什么解决了这个问题,因为我必须将这些所有依赖项一起更改为甚至运行应用程序。