【发布时间】:2019-03-22 06:37:48
【问题描述】:
我正在构建一个带有 getAll 查询的存储库,该查询使用复杂类型参数进行过滤,例如:
@Query("""
SELECT c FROM City c
WHERE :filter IS NULL OR c.code LIKE %:#{#filter.code}%
""")
fun getAllCitiesFiltered(@Param("filter") filter: MyFilter?) : List<City>
MyFilter 类是一个简单的 POJO:
class MyFilter {
var code: String? = null
var description: String? = null
}
在我的代码中的某个时刻,我调用了getAllCitiesFiltered(filter),而这个filter 可能为空,或者它的属性之一设置为空。我有两个问题:
- 如何处理
filter可以为空的事实?现在的方式(如上),每当将null值传递给它时,我都会得到一个异常EL1007E: Property or field 'code' cannot be found on null - 在 HQL 中是否有一种不那么丑陋的方式来处理属性
code和description可能为 null 并且当它们为 null 时我不想被它们过滤的事实?我现在想到的唯一方法是做... WHERE filter.code IS NULL or filter.code LIKE %c.code%之类的事情
我是 JPA 的新手,我不确定使用 @Query 是否是这里的最佳方法。我也愿意接受改变这一点的建议。
谢谢!
根据 Alan Hay 的建议进行编辑
我正在使用 QueryDSL,并且来自 C#/LINQ 背景,发现它很棒。 “问题”是我正在做这样的事情:
val city = QCity.city
var query = JPAQuery<City>(entityManager).from(city)
if (filter?.code != null)
query = query.where(city.code.eq("BH"))
if (filter?.description != null)
query = query.where(city.description.eq("Belo Horizonte"))
除了切换和 if/else'ing 之外,还有更好的写法吗?
谢谢!
【问题讨论】:
-
您可以放弃您的过滤器类并使用内置支持使用动态条件进行查询。请参阅:spring.io/blog/2011/04/26/…。示例:stackoverflow.com/a/26450224/1356423
-
非常感谢您的回答,艾伦。真正深入研究 QueryDSL。你能检查我对这个问题的编辑吗?
-
您不需要直接使用 EntityManager。如果这是一个网络应用程序,那么请在此处查看如何使用几乎为零的代码来完成整个工作:stackoverflow.com/a/46971053/1356423
标签: java jpa kotlin spring-data-jpa spring-data