【发布时间】:2018-07-13 02:00:09
【问题描述】:
这里是 Spring Boot。我目前对我的所有 JPA 实体都使用 JPA/Hibernate 和 CrudRepository 接口,到目前为止它对我来说效果很好。我需要执行一个需要UNION 的复杂查询,据我所知,Hibernate 不支持联合(或者至少不支持它们)。我通过在我的CrudRepository 中尝试了十几个 个不同的 JPQL 查询进行了验证,所有这些查询都失败了,因为 Hibernate(JPA 提供者)不喜欢 UNION。
因此,我完全可以在这种情况下使用原始 JDBC 查询,并从结果 ResultSet 执行我自己的准或映射回到我的实体实例。
我关心的是管理 JDBC 连接。我在应用程序配置 (YAML) 文件中配置我的 JPA/Hibernate 连接配置:
spring:
cache:
type: none
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/myapp_db?useSSL=false
username: root
testWhileIdle: true
validationQuery: SELECT 1
jpa:
show-sql: false
hibernate:
ddl-auto: none
naming:
physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
implicit-strategy: org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy
properties:
hibernate.dialect: org.hibernate.dialect.MySQL5InnoDBDialect
hibernate.cache.use_second_level_cache: false
hibernate.cache.use_query_cache: false
hibernate.generate_statistics: false
hibernate.hbm2ddl.auto: validate
- 我需要两个
DataSources,一个用于 JPA/Hibernate,另一个用于我的 JDBC(毕竟两者都连接到完全相同的数据库) - 维护这两个
DataSource实例是否会出现性能或网络/套接字问题? 我需要做的任何特别的事情 - 目前我不相信我的 JPA/Hibernate 配置使用连接池,但理想情况下我想使用 HikariCP 来为 JPA/Hibernate 以及我的原始 JDBC 查询
- 有没有办法让我的
CrudRepository实例(JPA/Hibernate)和我的原始 JDBC 连接使用完全相同的DataSource/config?如果是这样,这个配置/代码会是什么样子?
我知道这里有几个问题,但我相信正确的厌战 JDBC/JPA 资深人士将能够通过配置和/或代码的快速 sn-p 解决所有这些问题!提前致谢!
【问题讨论】:
-
您也可以使用 JPA 执行 SQL 查询。 EntityManager.createNativeQuery。无需使用 JDBC。
-
好的,谢谢@Simon....但是通过 JPA 会引出 Hibernate 作为提供者,而 Hibernate 不喜欢我的 UNION。
-
不! Hibernate 将按原样执行 SQL 语句。
-
啊,有趣。感谢@SimonMartinelli(所有 3 人 +1)。快速提问:我仔细阅读了this article,这让我看起来只需要访问
entityManager实例。然而,到目前为止,我已经使用CrudRepositories将所有这些抽象出来。根据this answer,它听起来就像我可以使用@Autowired将@PersistenceContext(unitName = "mytable")注入我的代码?这在实践中会是什么样子?谢谢!
标签: hibernate jpa spring-boot jdbc datasource