首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >表达式‘jpa’时空列表(spring数据jpa规范)

表达式‘jpa’时空列表(spring数据jpa规范)
EN

Stack Overflow用户
提问于 2018-09-12 09:18:55
回答 3查看 2.4K关注 0票数 2

我有一个任务存储库:

代码语言:javascript
复制
@Repository
interface MissionRepository: CrudRepository<MissionEntity, String>, JpaSpecificationExecutor<MissionEntity>

在我的任务服务类中,我想获取所有具有给定参数SetSet部分的任务。

代码语言:javascript
复制
fun findAllByCountryIdIn(countryIds: Set<String>): List<MissionEntity> =
        missionRepository.findAll(where(countryIdIn(countryIds)))
}

countryIdIn (使用in谓词)来自:

代码语言:javascript
复制
class MissionSpecifications {
    companion object {
        fun countryIdIn(countryIds: Set<String>): Specification<MissionEntity> =
            Specification { root, _, _ -> root.get<String>("countryId").`in`(countryIds) }
    }
}

但是当Set为空时,我得到了一个可预测的sql错误。是否只有在给定集不为空时才激活where子句?如果没有检查的话?也许我的规范语法可以改进以避免这个sql错误?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-09-12 09:46:36

我宁愿早点回来。所以,如果一开始不需要它,就不要添加一个where。您可以通过多种方式这样做,例如使用takeIf、简单的ifwhen等。

只列出一些示例:

  • takeIf missionRepository.findAll(where(countryIdIn(it))) findAllByCountryIdIn(countryIds: Set) = countryIds.takeIf { it.isNotEmpty() } ?.let {it.isNotEmpty} ?://否则应该返回什么?emptyList?全?例外?
  • (Kotlin >=1.3) findAllByCountryIdIn(countryIds: Set) = countryIds.ifEmpty { //应该返回什么?emptyList?所有条目?}{ missionRepository.findAll(where(countryIdIn(it))) } }.let {
  • if missionRepository.findAll(where(countryIdIn(countryIds))) findAllByCountryIdIn(countryIds: Set) = if (countryIds.isEmpty()) /*,应该返回什么?*/ else countryIds}

如果您只是解决countryIdIn,例如,通过传递一个空元素,则将查询本身的控制权交给助手方法。如果你真的想要的话,好吧.但否则我不会那么做的。

我为什么不这么做?如果我稍后返回到特定的代码并读取findAll(where(countryIdIn(countryIds)))。如果集合是空的,我需要多长时间才能确定返回所有条目?事实是:我不能不看countryIdIn本身。但这是我的观点。

票数 2
EN

Stack Overflow用户

发布于 2018-09-12 09:41:58

只要在创建Specification的函数中进行测试,如果集合是空的,那么只返回一个空的Specification

票数 0
EN

Stack Overflow用户

发布于 2018-09-12 13:24:24

另一种解决办法是:

代码语言:javascript
复制
@Repository
interface MissionRepository: JpaRepository<MissionEntity, String> {
    fun findByCountryIdIn(countryIds: Set<String>, pageable: Pageable): Page<MissionEntity>
}

您可以在其中添加分页。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52291683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档