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

Hibernate JPA存储库:设置符合条件的最新元素的字段,hibernate,Hibernate,我有一个JpaRepository,其中有许多元素符合相同的myCriteria。我想更改与myCriteria匹配的最新元素的布尔值。这是我的实体: @Entity @Table(name = "my_entity") @Getter @Setter @NoArgsConstructor @AllArgsConstructor public class MyEntity { private boolean myField; private String my

我有一个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,因为我得到了以下错误:预期EOF,在第1行附近发现“order”。我的问题是如何正确构造这个查询


感谢您抽出时间

首先,我必须说,您不能在HQL/JPQL中使用limit子句。例如,请参见此示例

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

公共接口MyRepository扩展了JpaRepository{ @修改 @Queryupdate MyEntity m set m.myField=true其中m.id=从MyEntity me where me.myCriteria=:myCriteria中选择maxme.id 无效的setAddressed@ParammyCriteria字符串标准; } 但对于您的情况,我只看到一种方法—本地查询

公共接口MyRepository扩展了JpaRepository{ @修改 @Queryvalue=更新我的\u实体设置我的\u字段=true,其中我的\u id=从我的\u实体中选择我的\u id,其中我的\u条件=:我的条件顺序由限制为1的我的\u创建,nativeQuery=true 无效的setAddressed@ParammyCriteria字符串标准; }
为了补充已接受的答案,下面是实现该技巧的本机查询:

@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);

你用什么样的hibernate方言?spring.jpa.properties.hibernate.dialogue=org.hibernate.dialogue.PostgreSqlDialogue谢谢你的回答。昨天,我最终选择了一个与您提出的查询类似的本机查询-我将在结果查询中添加一个答案,但您的答案应该是可接受的,因为它还提供了一种没有本机查询的替代方法