Hibernate的String集合子查询匹配
我有一个Company
实体,它有一个legalName: String
属性,还有一个aliases: Set<String>
属性(所以一对多) Company
将是父对象aliases
集合中的每个alias
字符串都是子对象
我成功地进行了一个查询,它返回所有匹配父母legalName
属性的公司(父母)和一个搜索查询字符串(LIKE),但我也想返回具有与搜索查询字符串匹配的别名(子女)的公司(父母) (所有与法定名称匹配的公司,或者至少一个别名,或两者兼有的公司)
我提前道歉,因为我觉得这是一个非常简单的例子,我非常习惯于编写普通的SQL,这是我第一次使用Hibernate或任何JPA实现
这是我的代码
val em: EntityManager = styxDao.getEntityManager
val criteriaBuilder: CriteriaBuilder = em.getCriteriaBuilder
val cq: CriteriaQuery[CompanyEntity] = criteriaBuilder.createQuery(classOf[CompanyEntity])
val companyEntityType: EntityType[CompanyEntity] = em.getMetamodel.entity(classOf[CompanyEntity])
val companyEntityRoot: Root[CompanyEntity] = cq.from(classOf[CompanyEntity])
var query: CriteriaQuery[CompanyEntity] = cq.select(companyEntityRoot)
if (countryCode == null) {
query = query.where(
criteriaBuilder.or(
criteriaBuilder.like( // if legalName matches ("LIKE") the search string
criteriaBuilder.lower(companyEntityRoot.get(companyEntityType.getDeclaredSingularAttribute("legalName", classOf[String]))),
"%" + legalNameQuery.toLowerCase + "%"
).asInstanceOf[Expression[jBoolean]],
// if any of the aliases match ("LIKE") the search string
)
)
}
别名不是实体本身,它只是一个字符串集合,我只想在我的OR中添加第二个条件,如果任何别名匹配相同的legalNameQuery
搜索字符串,则返回true
正如我前面提到的,如果我删除OR
部分并仅运行legalName字符串匹配,它将起作用,不起作用的是将与别名匹配的OR
的第二部分
我终于搞定了,不得不join
aliases
query = query.where(
criteriaBuilder.or(
criteriaBuilder.like( // if legalName matches ("LIKE") the search string
criteriaBuilder.lower(companyEntityRoot.get(companyEntityType.getDeclaredSingularAttribute("legalName", classOf[String]))),
"%" + legalNameQuery.toLowerCase + "%"
).asInstanceOf[Expression[jBoolean]],
criteriaBuilder.like (
criteriaBuilder.lower (companyEntityRoot.join("aliases") ),
"%" + legalName.toLowerCase + "%"
).asInstanceOf[Expression[jBoolean]]
)
)
链接地址: http://www.djcxy.com/p/6327.html
上一篇: Hibernate subquery of String collection match
下一篇: Hibernate criteria to have multiple restrictions on the child collection