【问题标题】:How to make a boolean toggle using JPQL如何使用 JPQL 进行布尔切换
【发布时间】:2023-03-27 21:07:01
【问题描述】:

我有一个可供购买的会话列表。客户购买会话后,如何将 available 字段更改为 0false 以使其不再出现在列表中?

这是我的 Session 实体类:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
    
@Column(name="date")
private String date;
    
@Column(name="time")
private String time;
    
@Column(name="available")
private boolean available;
    
@Column(name="side")
private String side;

这是我正在尝试使用的查询:

// Only update the available field while leaving everything else alone. Use the 
// Modifying annotation when using UPDATE, INSERT and DELETE Queries

@Modifying(clearAutomatically = true)
@Query("UPDATE Session s SET s.available=0")
List<Session>updateStatusNotAvailable(Boolean notAvailable);

【问题讨论】:

  • 经过大量研究,我得出的结论是,您无法通过 id 获取实体并使用 JPQL 查询来更新其中一个字段。我发现如果你通过它的 id 获得一个实体,你可以更改表中的所有其他实体,除了你正在更新的实体。我不知道为什么它会这样工作,但确实如此。

标签: java mysql spring hibernate jpql


【解决方案1】:

为了在你的情况下设置你的变量“notAvailable”,你必须将你的变量注入到查询注释中。有两个例子:

@Modifying(clearAutomatically = true)
@Query("UPDATE Session s SET s.available=?1")
List<Session>updateStatusNotAvailable(Boolean notAvailable);

路径参数示例:

// path param example
@Modifying(clearAutomatically = true)
@Query("UPDATE Session s SET s.available=:notAvailable")
List<Session>updateStatusNotAvailable(@Param("notAvailable") Boolean notAvailable);

【讨论】:

  • 感谢您的输入,非常感谢!不幸的是,这两种方法都不起作用。我从他们俩那里收到了“QueryExecutionRequestException:不支持 DML 操作”错误。
【解决方案2】:

在更新查询上添加Transactional注解:

@Transactional
@Modifying(clearAutomatically = true)
@Query("UPDATE Session s SET s.available = false")
List<Session> updateStatusNotAvailable();

调用上述方法时:

List<Session> sessions = sessionRepository.updateStatusNotAvailable();

【讨论】:

  • 感谢您的意见,但仍然无法正常工作。
【解决方案3】:

您需要将要为其设置可用性的会话 ID 传递为 false

@Modifying(clearAutomatically = true)
@Query("UPDATE Session s SET s.available=false where s.id=:id")
List<Session>updateStatusNotAvailable(Long id);

【讨论】:

    猜你喜欢
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-07
    • 2014-01-15
    • 1970-01-01
    相关资源
    最近更新 更多