Hibernate JPA存储库:设置符合条件的最新元素的字段
我有一个JpaRepository,其中有许多元素符合相同的myCriteria。我想更改与myCriteria匹配的最新元素的布尔值。这是我的实体: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
@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谢谢你的回答。昨天,我最终选择了一个与您提出的查询类似的本机查询-我将在结果查询中添加一个答案,但您的答案应该是可接受的,因为它还提供了一种没有本机查询的替代方法