簡體   English   中英

我可以在 JpaRepository nativeQuery 中使用枚舉參數嗎?

[英]Can I use enum parameter into JpaRepository nativeQuery?

實體看起來像這樣:

@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一起使用?

PS 我可以將String傳遞給方法而不是ApplicationStatus但也許還有另一種選擇?

遵循具有類似要求的類似問題以及指向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()}

擴展@Aivaras 答案:如果您想使用狀態列表,SpEL ecpression 略有不同 - 您需要進行投影:

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()]}

您可以在傳遞參數之前轉換為字符串。

這個怎么樣?

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

在出現此錯誤幾天后,我找到了解決方案。

我做了很多研究,並以多種方式進行了測試,作為參數接收@Param("environment") environment: Environment :

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

Kotlin 中的解決方案

關鍵在於查詢。 您必須使用.name()將參數的值轉換為字符串(或接收字符串作為參數)並將該字符串類型的值轉換為所需的特定 Enum 因為直接在查詢中傳遞 Enum 類型的對象不起作用。

假設您的數據庫中的 Enum 被定義為environment

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

區分:

  • 環境命名參數
  • 環境參數
  • 環境

#spring #jpa #postgresql #kotlin

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM