在我的Kotlin代码中:
我有一个实体类如下(简化):
@Entity
data class Person(
) {
@Id val id: String,
val phoneNumber: String
}
我有一个spring-data-jpa存储库,如下所示(简化):
interface PersonRepository: JpaRepository<Person, String> {
@Query(
value = "SELECT p FROM Person p WHERE :#T(com.xyz.PhoneUtils).normalizePhoneNumber(p.phoneNumber)} IN :phoneNumbers")
fun getPersonsByPhoneNumbers(phoneNumbers: Set<String>: Set<Person>): List<Person>
}
请注意,使用SPEL表达式调用指定类的静态函数。该函数将电话号码规范化为标准的E.164电话号码格式。这种复杂性的原因是Person记录可能包含非标准格式的电话号码,但通过查询参数phoneNumbers提供的phoneNumbers是规范化的。为了进行比较,我需要规范化 @query 查询表达式。
然而,我无法弄清楚如何在SPEL表达式中使用实体属性 phoneNumber 作为 PhoneUtils.normalizePhoneNumber 的函数参数。Spring文档没有提到在SPEL表达式中使用实体属性,尽管它确实提到了如何在SPEL表达式中使用查询参数。
是否可以在SPEL表达式中使用实体属性作为函数参数?如果可以,如何使用?TIA。
1条答案
按热度按时间6ie5vjzr1#
我现在意识到,由于JPQL查询Map到SQL查询,因此使用带有实体属性作为参数的函数的唯一方法是由数据库调用查询。该解决方案需要使用特定于数据库的方法调用Kotlin/Java静态方法。对于我的HSQLDB,以下描述了如何完成:
https://hsqldb.org/doc/2.0/guide/sqlroutines-chapt.html#src_jrt_static_methods