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

Spring Boot JPA按两列查询最新条目及指定ID最旧条目求助

问题1:Spring Boot JPA中通过两列查询最新数据库条目

假设你要按customer_id和event_type这两列筛选,查询符合条件的最新条目(按时间字段如create_time倒序取第一条),以下是几种实现方式:

方式1:Spring Data JPA方法命名

定义Repository方法,利用方法命名规则自动生成查询:

public interface EventRepository extends JpaRepository<Event, Long> {
    Event findFirstByCustomerIdAndEventTypeOrderByCreateTimeDesc(Long customerId, String eventType);
}

调用时传入对应的customerId和eventType,即可返回符合条件的最新条目。

方式2:自定义JPQL查询

用@Query注解编写JPQL语句,适配复杂场景:

public interface EventRepository extends JpaRepository<Event, Long> {
    @Query("SELECT e FROM Event e WHERE e.customerId = :customerId AND e.eventType = :eventType ORDER BY e.createTime DESC")
    Event findLatestByCustomerIdAndEventType(@Param("customerId") Long customerId, @Param("eventType") String eventType, Pageable pageable);
}

调用时传入分页参数限制返回数量:

eventRepository.findLatestByCustomerIdAndEventType(1L, "LOGIN", PageRequest.of(0, 1));

方式3:原生SQL查询

直接使用数据库原生语法,适合需要特定数据库特性的场景:

public interface EventRepository extends JpaRepository<Event, Long> {
    @Query(value = "SELECT * FROM event WHERE customer_id = :customerId AND event_type = :eventType ORDER BY create_time DESC LIMIT 1", nativeQuery = true)
    Event findLatestByCustomerIdAndEventTypeNative(@Param("customerId") Long customerId, @Param("eventType") String eventType);
}

问题2:按customer id和eventType筛选、id为3的最旧数据库条目

情况1:id为主键(唯一)

如果id是表的主键,直接根据id查询即可:

public interface EventRepository extends JpaRepository<Event, Long> {
    Optional<Event> findById(Long id);
}

调用eventRepository.findById(3L)就能获取该条目。

情况2:id非主键,需筛选customer_id、eventType且id=3的最旧条目

如果id不是唯一值,需要同时满足id=3、customer_id和eventType条件,并取最旧的条目:

public interface EventRepository extends JpaRepository<Event, Long> {
    // 方法命名方式
    Event findFirstByIdAndCustomerIdAndEventTypeOrderByCreateTimeAsc(Long id, Long customerId, String eventType);

    // JPQL方式
    @Query("SELECT e FROM Event e WHERE e.id = :id AND e.customerId = :customerId AND e.eventType = :eventType ORDER BY e.createTime ASC LIMIT 1")
    Event findOldestByIdAndCustomerIdAndEventType(@Param("id") Long id, @Param("customerId") Long customerId, @Param("eventType") String eventType);
}

情况3:筛选customer_id、eventType,取该组最旧条目(原表述可能存在误差)

如果你实际需要的是按customer_id和eventType筛选,取符合条件的最旧条目,可使用:

Event findFirstByCustomerIdAndEventTypeOrderByCreateTimeAsc(Long customerId, String eventType);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 06:30:50