Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jpa规范用于查找字段';s值_Java_Jpa_Jakarta Ee_Spring Data Jpa_Kotlin - Fatal编程技术网

Java Jpa规范用于查找字段';s值

Java Jpa规范用于查找字段';s值,java,jpa,jakarta-ee,spring-data-jpa,kotlin,Java,Jpa,Jakarta Ee,Spring Data Jpa,Kotlin,我正在使用Spring Data JPA在持久层上编写一个webapp,更具体地说,我的DAOs扩展了JpaSpecificationExecutor接口,因此我能够实现某种过滤器;想象一下有几个属性的项的列表(为了清晰起见,我省略了注释和其他元数据): 数据类项(变量标记:可变列表) 在我的服务层上,我的筛选方法如下所示: fun findBy(tagsToFilterBy: List<String>): List<Items> { return dao.fi

我正在使用Spring Data JPA在持久层上编写一个webapp,更具体地说,我的DAOs扩展了
JpaSpecificationExecutor
接口,因此我能够实现某种过滤器;想象一下有几个属性的
项的列表(为了清晰起见,我省略了注释和其他元数据):

数据类项(变量标记:可变列表)
在我的服务层上,我的筛选方法如下所示:

fun findBy(tagsToFilterBy: List<String>): List<Items> {
    return dao.findAll { root, query, builder ->
        builder.//??
    }
}
fun findBy(tagsToFilterBy:List):List{
返回dao.findAll{root,query,builder->
建筑商/??
}
}
我想要实现的是只检索恰好包含
tagsToFilterBy
Item
s,换句话说,
tagsToFilterBy
应该是
Item.tags
的子集

我知道
isMember(…)
方法,但我认为它的用法对于许多标记来说不是很好,因为它在调用时只接受一个“实体”。你能给我一些建议吗

我的另一个问题是,直接在
builder.like(someExpression,inputFromUser)
中使用用户输入是否安全,或者我必须将其放入
builder.parameter(…)
中,然后再放入
query.setParameter(…)


感谢您的任何想法

一种方法是使用过滤器并测试每个元素,以查看您的过滤器列表是否包含它

val result = dao.filter { tagsToFilterBy.contains(it.tag) }
为了加快速度,您可以强制对筛选器列表进行排序,也可以使用
binarySearch
,但性能改进(或不改进)将取决于筛选器列表的大小。例如,假设排序了
tagsToFilterBy
,则:

val result2 = dao.filter { tagsToFilterBy.binarySearch(it.tag) >= 0 }

该页面描述了这些扩展方法中的每一种。

因此我设法自己编写。我并不是说它很漂亮,但它是最漂亮的一款,我可以选择:

dao.findAll { root, query, builder ->
    val lst = mutableListOf<Predicate>()
    val tagsPath = root.get<List<Tag>>("tags")
    tagsToFilterBy.forEach {
        lst.add(cb.isMember(it, tagsPath))
    }
    cb.or(*lst.toTypedArray())
}
dao.findAll{root,query,builder->
val lst=mutableListOf()
val tagsPath=root.get(“标记”)
塔格斯多比·弗雷奇{
第一次添加(cb.isMember(it,tagsPath))
}
cb.or(*lst.toTypedArray())
}

这基本上是检查给定的标记,并检查它是否是标记的成员。

我忘了在问题中提到我可能有更多属性可供筛选,这就是为什么我需要使用
规范
我发布了为我解决问题的代码,请随意查看。
dao.findAll { root, query, builder ->
    val lst = mutableListOf<Predicate>()
    val tagsPath = root.get<List<Tag>>("tags")
    tagsToFilterBy.forEach {
        lst.add(cb.isMember(it, tagsPath))
    }
    cb.or(*lst.toTypedArray())
}