JPA Repository: set field of most recent element that matches criteria
我有一个 JpaRepository,它有许多匹配相同 myCriteria 的元素。我想更改匹配 myCriteria 的最新元素的布尔值。这是我的实体:
1
2 3 4 5 6 7 8 9 10 11 |
@Entity
@Table(name =”my_entity”) @Getter @Setter @NoArgsConstructor @AllArgsConstructor public class MyEntity { private boolean myField; private String myCriteria; private LocalDateTime createdAt; } |
这是我的存储库和查询:
1
2 3 4 5 6 7 |
public interface MyRepository extends JpaRepository<MyEntity, UUID> {
@Modifying } |
似乎我没有正确使用 order by,因为我收到以下错误:expecting EOF, found ‘order’ near line 1。我的问题是如何正确构造这个查询?
感谢您的宝贵时间
- 你使用什么hibernate方言?
- spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
首先我不得不说你不能在HQL/JPQL 中使用limit 子句。例如看这个问题。
第二个问题是您使用 UUID 类型作为实体的主键。
想象一下它是一个 Long 类型。在这种情况下,您将能够以这种方式重写您的查询:
1
2 3 4 5 6 |
public interface MyRepository extends JpaRepository<MyEntity, Long> {
@Modifying |
但对于您的情况,我只看到一种方法 – 原生查询。
1
2 3 4 5 6 |
public interface MyRepository extends JpaRepository<MyEntity, UUID> {
@Modifying |
- 谢谢您的回答。昨天我最终选择了一个类似于您提供的本机查询 – 我将在结果查询中添加一个答案,但您的答案应该是公认的,因为它还提供了一种没有本机查询的替代方法
为了补充接受的答案,这里是本机查询的诀窍:
1
2 3 4 5 6 |
@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); |
来源:https://www.codenong.com/63959453/