Scala结合Hibernate时如何解决‘重载模糊’问题?
解决Scala+Hibernate Criteria API
where方法重载模糊问题 直接解决重载歧义的方案
方案1:使用CriteriaBuilder.equal生成明确的Predicate
通过cb.equal直接创建Predicate,让类型推断明确匹配where(Predicate...)重载:
val cb = sessionFactory.getCriteriaBuilder val query = cb.createQuery(classOf[T]) val root = query.from(classOf[T]) // 生成明确的Predicate类型 val statusPredicate: Predicate = cb.equal(root.get("status"), status) val queryResults: TypedQuery[T] = session.createQuery(query.select(root).where(statusPredicate))
方案2:显式转换表达式类型
将equalTo返回的Expression[Boolean]强制转为Predicate,消除类型歧义:
val cb = sessionFactory.getCriteriaBuilder val query = cb.createQuery(classOf[T]) val root = query.from(classOf[T]) val queryResults: TypedQuery[T] = session.createQuery( query.select(root).where(root.get("status").equalTo(status).asInstanceOf[Predicate]) )
替代方案:使用JPQL查询
如果觉得Criteria API的类型问题麻烦,改用JPQL会更简洁直观,完全避免重载歧义:
// 泛型场景下动态生成JPQL val entityClass = classOf[T] val jpql = s"FROM ${entityClass.getSimpleName} e WHERE e.status = :status" val queryResults: TypedQuery[T] = session.createQuery(jpql, entityClass) queryResults.setParameter("status", status)
问题原因
Hibernate的CriteriaQuery.where提供了两个重载:
where(Predicate... restrictions)where(Expression<Boolean> restriction)
在Scala中,root.get("status").equalTo(status)返回的Expression<Boolean>会被编译器同时匹配两个重载(因为Scala会自动将单个对象转为可变参数数组),导致类型推断模糊。显式指定Predicate类型或改用JPQL即可解决。
内容的提问来源于stack exchange,提问作者Kris Rice
相关产品推荐
相关产品推荐

