我可以在JpaRepository nativeQuery中使用enum参数吗?

2022-09-01 03:20:56

实体如下所示:

@Getter
@Setter
@Entity
public class Application {
@Id
private Long id;
@Enumerated(EnumType.STRING)
private ApplicationStatus status;
}

代码的工作方式如下:

public interface ApplicationRepository extends JpaRepository<Application, Long> {
@Query("SELECT app FROM #{#entityName} AS app WHERE app.status LIKE :status")
List<Application> find(@Param("status") ApplicationStatus status);

但是与nativeQuery相同的代码段 - 没有:

@Query(value = "SELECT app.* FROM application AS app WHERE app.status LIKE :status", nativeQuery = true)
List<Application> findNative(@Param("status") ApplicationStatus status);
}

我没有任何例外,只是空列表。

我该如何解决这个问题?可以与 一起使用吗?enumnativeQuery

P.S我可以传入方法而不是,但也许还有另一种选择?StringApplicationStatus


答案 1

遵循具有类似要求的类似问题以及指向可以使用的Spring Expression Language(SpEL)的答案之一

public interface ApplicationRepository extends JpaRepository<Application, Long> {
    @Query(nativeQuery = true, value = "SELECT app FROM #{#entityName} AS app WHERE app.status=:#{#status.name()}")
    List<Application> find(@Param("status") ApplicationStatus status);
}

以上重要部分是app.status=:#{#status.name()}


答案 2

为了扩展@Aivaras答案:如果要使用状态列表,SpEL 表达式略有不同 - 您需要执行投影:

public interface ApplicationRepository extends JpaRepository<Application, Long> {
    @Query(nativeQuery = true, value = "SELECT app FROM #{#entityName} AS app WHERE app.status in :#{#statuses.![name()]}")
    List<Application> find(@Param("statuses") List<ApplicationStatus> statuses);
}

请注意,表达式更改为

#{#statuses.![name()]}