Spring Boot 1.4.2与Hibernate Core 5.0.11兼容性问题:Session无getCriteriaBuilder方法
Hey there! I totally get why this is frustrating—version compatibility issues can eat up way too much time, especially when you're still getting up to speed with Spring Boot. Let's figure this out together.
为什么会出现这个问题?
In Hibernate 5.0.x (like the 5.0.11.Final you're using), the getCriteriaBuilder() method isn't directly exposed on the org.hibernate.Session interface. Even though Hibernate's Session implements the JPA EntityManager interface under the hood, the Session interface itself doesn't include this method in early 5.x releases. This method is actually defined in the standard JPA javax.persistence.EntityManager interface, not Hibernate's specific Session.
快速解决方案
You have a couple of straightforward ways to get access to the CriteriaBuilder:
1. 把Session转换为EntityManager
Use the unwrap() method on your Session instance to get the underlying EntityManager, then call getCriteriaBuilder() on that:
// 假设你已经获取到了Session实例 Session session = ...; EntityManager entityManager = session.unwrap(EntityManager.class); CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
2. 从EntityManagerFactory直接获取
If you have access to an EntityManagerFactory bean (which Spring Boot auto-configures for you), you can get the CriteriaBuilder directly from it without needing a Session:
@Autowired private EntityManagerFactory entityManagerFactory; // 在需要的地方调用 CriteriaBuilder criteriaBuilder = entityManagerFactory.getCriteriaBuilder();
长远建议:考虑升级Spring Boot版本
Spring Boot 1.4.2.RELEASE is pretty outdated at this point. Later versions (like 1.5.x, which is still maintained for legacy use, or newer stable releases) come with newer Hibernate versions (5.2+ in later Spring Boot 2.x releases). In Hibernate 5.2 and above, the Session interface directly inherits methods from EntityManager, so you'll be able to call session.getCriteriaBuilder() directly without any workarounds. Upgrading will also fix a lot of other compatibility bugs and give you access to newer features.
内容的提问来源于stack exchange,提问作者niranjan

