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

hmtdttj4  于 2023-03-21  发布在  Java
关注(0)|答案(6)|浏览(164)

实体如下所示:

@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我可以把String传递到方法中而不是ApplicationStatus,但也许还有另一种选择?

brc7rcf0

brc7rcf01#

similar question之后有类似的需求,one of the answers指向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()}

4uqofj5v

4uqofj5v2#

在@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()]}
3duebb1j

3duebb1j3#

我使用#{#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 };

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

uklbhaso

uklbhaso4#

经过几天的错误,我找到了解决方案。
我做了大量的研究,并在许多方面进行了测试,将@Param("environment") environment: Environment作为参数接收:

:#{#environment.TESTING}
 :#{#environment}
 :#{#environment.name()}
 CAST(:#{#environment.name()} as environment)

Kotlin解决方案

关键字在查询中。必须使用.name()将参数的值转换为String(或接收String作为参数),并将String类型的值转换为所需的特定Enum。因为直接在查询中传递Enum类型的对象不起作用。
假设数据库中的Enum定义为environment

@Query(
        value = "SELECT some_routine(CAST(:#{#environmentNamedParam.name()} as environment))",
        nativeQuery = true
)
fun yourFunction(
        @Param("environmentNamedParam") environmentParam: Environment
) : Boolean

区分:

  • environmentNamedParam
  • 环境参数
  • 环境

spring #jpa #postgresql #Kotlin

kqhtkvqz

kqhtkvqz5#

你可以在传递参数之前转换为字符串。

imzjd6km

imzjd6km6#

这个怎么样?

public interface ApplicationRepository extends JpaRepository<Application, Long> {
List<Application> findByStatus(ApplicationStatus status);

相关问题