![](/img/trans.png)
[英]Can i use redis along side JpaRepository in the same model?
[英]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);
}
而且我没有任何例外,只是空列表。
我该如何解决这个问题? 是否可以将enum
与nativeQuery
一起使用?
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)
关键在于查询。 您必须使用.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.