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
相关产品推荐
相关产品推荐

