You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Quarkus Panache如何执行自定义查询?求实现指导

在Quarkus中实现自定义原生查询的几种方式

Quarkus中实现自定义原生查询主要有两种主流路径,基于Panache(Quarkus简化JPA的工具)或标准JPA,以下是具体实现方案:

1. 使用Panache Repository(推荐)

Panache是Quarkus官方推荐的JPA简化方案,写法和Spring Data JPA高度相似,上手成本低:

方式一:通过@Query注解声明原生查询

直接在Panache Repository的方法上添加@Query注解,指定nativeQuery = true即可,无需手动实现方法体:

import io.quarkus.hibernate.orm.panache.PanacheRepository;
import jakarta.enterprise.context.ApplicationScoped;
import java.util.Collection;

@ApplicationScoped
public class UserRepository implements PanacheRepository<User> {

    @Query(value = "SELECT * FROM USERS u WHERE u.status = 1", nativeQuery = true)
    Collection<User> findAllActiveUsersNative();
}

方式二:手动通过EntityManager执行原生查询

如果需要动态拼接SQL等灵活场景,可直接注入EntityManager执行原生查询:

import jakarta.enterprise.context.ApplicationScoped;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import java.util.List;

@ApplicationScoped
public class UserRepository {

    @PersistenceContext
    EntityManager em;

    public List<User> findAllActiveUsersNative() {
        return em.createNativeQuery("SELECT * FROM USERS u WHERE u.status = 1", User.class)
                .getResultList();
    }
}

2. 使用标准JPA Repository

若不依赖Panache,可使用标准JPA的方式实现:

方式一:通过@NamedNativeQuery预定义查询

先在实体类上声明命名原生查询:

import jakarta.persistence.Entity;
import jakarta.persistence.NamedNativeQuery;
import jakarta.persistence.Table;

@Entity
@Table(name = "USERS")
@NamedNativeQuery(
        name = "User.findAllActiveUsers",
        query = "SELECT * FROM USERS u WHERE u.status = 1",
        resultClass = User.class
)
public class User {
    // 实体字段定义...
}

然后在Repository中调用该命名查询:

import jakarta.enterprise.context.ApplicationScoped;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import java.util.List;

@ApplicationScoped
public class UserRepository {

    @PersistenceContext
    EntityManager em;

    public List<User> findAllActiveUsersNative() {
        return em.createNamedQuery("User.findAllActiveUsers", User.class)
                .getResultList();
    }
}

方式二:动态执行原生查询

和Panache中的手动方式一致,直接通过EntityManager创建原生查询执行(代码同Panache方式二,此处省略重复内容)

补充:带参数的原生查询

如果需要传递参数,可使用位置参数或命名参数:

  • 位置参数示例:
@Query(value = "SELECT * FROM USERS u WHERE u.status = ?1", nativeQuery = true)
Collection<User> findUsersByStatusNative(Integer status);
  • 命名参数示例:
import jakarta.persistence.Param;
// 在Panache Repository中:
@Query(value = "SELECT * FROM USERS u WHERE u.status = :status", nativeQuery = true)
Collection<User> findUsersByStatusNative(@Param("status") Integer status);

内容的提问来源于stack exchange,提问作者Hzt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 17:03:15