Quarkus Hibernate ORM无结果时返回null/空列表配置问题
解决Quarkus Hibernate ORM查询无结果抛异常的问题
配置不生效的原因
你配置的quarkus.hibernate-orm.returning-null-on-no-result=true仅对Panache的特定方法生效(比如findUnique()、findByIdOptional()),用于让这些方法在无结果时返回null而非抛出异常,但对原生EntityManager的查询逻辑没有作用,所以不会生效。
另外注意:你当前代码中使用的resultList()方法本身在Hibernate中就会返回空列表(而非抛出异常),你遇到的500错误可能来自其他异常(比如参数绑定错误、实体映射问题等),建议不要捕获所有Throwable,缩小异常范围以便排查真正问题。
推荐解决方案:改用Panache Kotlin Repository API
既然你已经依赖了quarkus-hibernate-orm-panache-kotlin,直接使用Panache封装的查询方法可以彻底避免手动处理异常:
- 定义User实体的Repository类:
import io.quarkus.hibernate.orm.panache.kotlin.PanacheRepository import jakarta.enterprise.context.ApplicationScoped @ApplicationScoped class UserRepository : PanacheRepository<User> { fun getByEmail(email: String): MutableList<User> { // 直接使用Panache的list方法,无结果时自动返回空列表 return list("email", email) // 若需自定义JPQL,也可以用这种方式: // return find("SELECT u FROM User u WHERE u.email = :email", mapOf("email" to email)).list() } }
Panache的查询方法会自动处理无结果的情况,无需额外try-catch。
备选方案:封装通用工具方法(原生EntityManager场景)
如果必须使用原生EntityManager,可以封装一个通用扩展函数来统一处理异常:
import jakarta.persistence.EntityManager import jakarta.persistence.NoResultException import jakarta.persistence.NonUniqueResultException fun <T> EntityManager.safeQueryResultList(jpql: String, params: Map<String, Any>): MutableList<T> { return try { val query = createQuery(jpql, T::class.java) params.forEach { (key, value) -> query.setParameter(key, value) } query.resultList } catch (e: NoResultException) { mutableListOf() } catch (e: NonUniqueResultException) { // 处理结果不唯一的情况,按需调整逻辑 mutableListOf() } catch (e: IllegalArgumentException) { // 处理参数绑定错误 mutableListOf() } }
调用示例:
fun getByEmail(email: String): MutableList<User> { return em.safeQueryResultList( "SELECT u FROM User u WHERE u.email = :email", mapOf("email" to email) ) }
内容的提问来源于stack exchange,提问作者Jonas Götz
相关产品推荐
相关产品推荐

