java - Hibernate session.createSQLQuery

标签 java spring hibernate maven spring-mvc

我有两个项目,maven。

  • A - 休息应用,使用 hibernate 5.2.16.FINAL,包括 B(不包括其 hibernate)
  • B - 库,使用 hibernate 4.3.9

项目 A 创建自己的上下文,导入 DBConfig(B 的副本)替换 B 的 DBConfig,以使用正确的 hibernate5.HibernateTransactionManager、hibernate5.LocalSessionFactoryBean

项目 A 调用 B 中的服务 -> DAO -> 获取 session -> createSQLQuery。 失败并显示

java.lang.NoSuchMethodError: org.hibernate.Session.createSQLQuery(Ljava/lang/String;)Lorg/hibernate/SQLQuery;

当我在 B 中将 hibernate 更改为 5.2.16 且没有任何进一步的代码更改时,它可以工作,或者如果我将 DAO 从 B 移动到 A(也在上下文中进行了正确的配置 - 包括移动的 DAO 并排除一个)来自 B - 因为 bean 名称重复)它也有效?!

这怎么可能?我真的不明白或错过了一些东西。如果项目 B 上没有任何代码更改,只需配置 maven hibernate 依赖项(如上所述,它被排除在 A 中),代码要么在 DAO.createSQLQuery 上运行,要么失败。

有人有什么想法吗?

谢谢。

最佳答案

您可能需要使用相同的 Hibernate 版本来编译这两个项目。

为什么在您的情况下会出现 java.lang.NoSuchMethodError: createSQLQuery 在 4.3 ( http://docs.jboss.org/hibernate/orm/4.3/javadocs/org/hibernate/SharedSessionContract.html ) 和 5.2 ( http://docs.jboss.org/hibernate/orm/5.2/javadocs/org/hibernate/query/QueryProducer.html ) 中的定义略有不同。请注意,返回类型不同。

在编译时,如果使用任一版本,方法调用都会正确解析。这是因为 5.2 (NativeQuery) 使用的返回类型扩展了 4.3 (SQLQuery) 使用的返回类型。但是,一旦使用 4.3 编译 B,它就会引用 4.3 定义的 createSQLQuery (SQLQuery createSQLQuery(String)),并且在 5.2 中找不到,您可以使用在运行时。

关于java - Hibernate session.createSQLQuery,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49877297/

相关文章:

java - 玩!框架 2.0 crud 模块

json - 将对象从 Spring MVC 3 REST 客户端发送到 REST 提供者

Java 绑定(bind) JTextField -> java.lang.Integer 问题

java - java中有没有一种方法可以绘制一个以双变量为中心的圆?

java - 错误: HTTP status 404:The requested resource is not available?

java - Hibernate List<Object[]> 到特定对象

java - Hibernate @OneToOne 自连接,在连接子句中使用 OR

java - hibernate 和 jpa 怪异;意外的懒惰获取

java - 使用 JDT 的 AST 识别传递给方法的参数类型

java - Spring Thymeleaf - 如何映射到需要从 HTML 传递到 Controller 的 ID 的 URL?