我可以将enum参数用于JpaRepository nativeQuery吗?

Tet*_*iuk 18 java sql enums hibernate spring-data-jpa

实体看起来像这样:

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

代码以这种方式工作:

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);
Run Code Online (Sandbox Code Playgroud)

但是使用nativeQuery的相同代码段 - 不会:

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

而且我没有任何异常,只是空列表.

我怎样才能解决这个问题?是否有可能使用enumnativeQuery

PS我可以String转入方法而不是ApplicationStatus但也许有另一种选择?

Aiv*_*ras 11

遵循具有类似要求的类似问题以及指向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);
}
Run Code Online (Sandbox Code Playgroud)

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


Ale*_*xey 7

扩展@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);
}
Run Code Online (Sandbox Code Playgroud)

请注意将表达式更改为

#{#statuses.![name()]}
Run Code Online (Sandbox Code Playgroud)


Ous*_*ama 5

我使用解决了这个问题#{#paramName?.name()}

public interface ItemRepository extends JpaRepository<Item, Long> {
    @Query(value = "select * from items where type = :#{#type?.name()}", nativeQuery = true)
    List<Item> findByType(@Param("type") EnumType type);
}
 
public enum EnumType { NORMAL, LARGE };
Run Code Online (Sandbox Code Playgroud)

注意:“?” 管理参数为空时的情况type


Dav*_* M. -3

这个怎么样?

public interface ApplicationRepository extends JpaRepository<Application, Long> {
List<Application> findByStatus(ApplicationStatus status);
Run Code Online (Sandbox Code Playgroud)

  • 在我的问题中,我使用简化的示例,我的实际代码更加复杂,我需要使用“nativeQuery”。 (3认同)