如何在JPA Repository中为给定Hibernate代码片段编写对应查询?
JPA Repository 等价查询实现方案
你可以通过以下三种常见方式实现和原有Hibernate Criteria完全一致的逻辑,可根据项目习惯选择:
前置确认
首先确认LoginDetails实体类的字段映射规则:若实体属性采用驼峰命名(和数据库下划线字段对应),对应关系为:
- 数据库
user_id→ 实体属性userId - 数据库
login_date→ 实体属性loginDate - 数据库
live_ind→ 实体属性liveInd
如果实体属性直接和数据库字段名一致,修改下方对应属性名即可。
方式1:方法名衍生查询(无需手写SQL,最简单)
直接在LoginDetailsRepository接口中定义如下方法即可,JPA会自动根据方法名生成查询语句:
import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; public interface LoginDetailsRepository extends JpaRepository<LoginDetails, /* 替换为你的实体主键类型,比如Long */> { List<LoginDetails> findTop2ByUserIdAndLiveIndTrueOrderByLoginDateDesc(String userId); }
逻辑对应说明:
Top2:对应原代码的setMaxResults(2),返回前2条结果ByUserId:对应Restrictions.eq("user_id", userId)等值匹配条件LiveIndTrue:对应Restrictions.eq("live_ind", true)等值匹配条件OrderByLoginDateDesc:对应addOrder(Order.desc("login_date"))降序排序逻辑
方式2:JPQL注解查询(灵活度更高,适合复杂逻辑扩展)
如果需要自定义查询逻辑,用@Query注解写JPQL语句:
import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import java.util.List; public interface LoginDetailsRepository extends JpaRepository<LoginDetails, Long> { @Query("SELECT ld FROM LoginDetails ld WHERE ld.userId = :userId AND ld.liveInd = TRUE ORDER BY ld.loginDate DESC") List<LoginDetails> findTop2ByUserId(@Param("userId") String userId); }
方式3:原生SQL查询(和原Criteria逻辑完全对齐,直接操作数据库字段)
如果希望直接使用数据库字段名编写,和原有SQL逻辑完全一致,可以开启原生查询:
import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import java.util.List; public interface LoginDetailsRepository extends JpaRepository<LoginDetails, Long> { @Query(value = "SELECT * FROM login_details WHERE user_id = :userId AND live_ind = 1 ORDER BY login_date DESC LIMIT 2", nativeQuery = true) List<LoginDetails> findLoginDetailsByUserId(@Param("userId") String userId); }
注:原生SQL中的布尔值、limit语法需要和你使用的数据库匹配,上述示例为MySQL语法,若使用Oracle可替换为
WHERE ROWNUM <=2。
内容的提问来源于stack exchange,提问作者Programmer
相关产品推荐
相关产品推荐

