如何正确使用Hibernate @Where注解筛选deleted_at非空的实体?
解决Spring Boot JPA中使用@Where注解筛选deleted_at不为空实体的问题
你的问题出在SQL条件的写法上——SQL里判断字段是否为NULL不能用普通的=运算符,必须使用IS NULL或IS NOT NULL。你之前尝试的deleted_at=null这类写法在SQL中是无效的,这就是为什么返回空数组。
要实现“仅查询deleted_at列不为空的实体”,只需把@Where注解的clause值改成deleted_at IS NOT NULL即可。
修改后的实体代码如下:
@Data @Entity @Table(name="examples") @NamedQuery(name="Example.findAll", query="SELECT l FROM Example l") @SQLDelete(sql = "UPDATE examples SET deleted_at = CURRENT_TIMESTAMP() WHERE id = ?") @Where(clause = "deleted_at IS NOT NULL") // 关键修改处 public class Example { @Id @GeneratedValue(strategy= GenerationType.IDENTITY) Long id; String name; Timestamp deletedAt; }
补充说明:
- 如果需求是查询未被软删除的实体(即deleted_at为空的记录),只需把clause改成
deleted_at IS NULL。 - JPA会自动将实体中的
deletedAt字段映射到数据库的deleted_at列(驼峰转下划线的默认规则),无需手动指定列名匹配。
内容的提问来源于stack exchange,提问作者Karlo Gašpar
相关产品推荐
相关产品推荐

