JPA存储库:设置符合条件的最近元素的字段



我有一个JpaRepository,它有许多与同一myCriteria匹配的元素。我想更改与myCriteria匹配的最新元素的布尔值。这是我的实体:

@Entity
@Table(name = "my_entity")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class MyEntity {
private boolean myField;
private String myCriteria;
private LocalDateTime createdAt;
}

这是我的存储库和查询:

public interface MyRepository extends JpaRepository<MyEntity, UUID> {
@Modifying
@Query("update MyEntity myEntity set myEntity.myField = true where myEntity.myCriteria = :myCriteria order by myEntity.createdAt limit 1")
void setAddressed(@Param("myCriteria") String myCriteria);
}

我似乎没有正确使用order by,因为我收到以下错误:expecting EOF, found 'order' near line 1。我的问题是如何正确地构造这个查询?

感谢您抽出时间

首先我必须说,不能在HQL/JQL中使用limit子句。例如,请参阅此问题。

第二个问题是使用UUID类型作为实体的主键。想象一下,它将是一个Long类型。在这种情况下,您可以用这种方式重写查询:

public interface MyRepository extends JpaRepository<MyEntity, Long> {
@Modifying
@Query("update MyEntity m set m.myField = true where m.id = (select max(me.id) from MyEntity me where me.myCriteria = :myCriteria)")
void setAddressed(@Param("myCriteria") String myCriteria);
}

但对于您的情况,我只看到一种方法——本地查询。

public interface MyRepository extends JpaRepository<MyEntity, UUID> {
@Modifying
@Query(value = "update my_entity set my_field = true where my_id = (select my_id from my_entity where my_criteria = :myCriteria order by my_created_at limit 1)", nativeQuery = true)
void setAddressed(@Param("myCriteria") String myCriteria);
}

为了补充已接受的答案,这里有一个本机查询:

@Modifying
@Query(value =
"UPDATE my_entity SET my_field = true FROM "
+ "( SELECT * FROM my_entity WHERE my_criteria = :myCriteria ORDER BY created_at desc LIMIT 1 ) "
+ "AS subquery WHERE my_entity.my_criteria = subquery.my_criteria", nativeQuery = true)
void setAddressed(@Param("myCriteria") String myCriteria);

最新更新