String 集合匹配的 Hibernate 子查询
Hibernate subquery of String collection match
我有一个 Company
实体,它有一个 legalName: String
属性 和一个 aliases: Set<String>
属性(所以是 One-to-many)
Company
将是 parent
aliases
集合中的每个 alias
字符串将是 children
我成功查询了 returns 所有公司 (parents) 与 parent legalName
属性 匹配的搜索查询字符串(LIKE),但我也想 return 个公司 (parents) 的别名 (children) 也与搜索查询字符串相匹配(所有公司都符合合法名称,或至少一个别名,或两者)
我提前道歉,因为我觉得这是一个非常简单的案例,而且我非常习惯编写简单的代码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
)
)
}
别名不是一个实体 per-se,它只是一个字符串集合,我只想在我的 OR 中添加第二个条件,即 return 如果任何别名匹配则为真相同的 legalNameQuery
搜索字符串
正如我之前提到的,如果我删除 OR
部分并且仅 运行 legalName 字符串匹配,它会起作用,但不起作用的是 [=19= 的第二部分] 将匹配别名
我终于成功了,不得不 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]]
)
)
我有一个 Company
实体,它有一个 legalName: String
属性 和一个 aliases: Set<String>
属性(所以是 One-to-many)
Company
将是 parent
aliases
集合中的每个 alias
字符串将是 children
我成功查询了 returns 所有公司 (parents) 与 parent legalName
属性 匹配的搜索查询字符串(LIKE),但我也想 return 个公司 (parents) 的别名 (children) 也与搜索查询字符串相匹配(所有公司都符合合法名称,或至少一个别名,或两者)
我提前道歉,因为我觉得这是一个非常简单的案例,而且我非常习惯编写简单的代码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
)
)
}
别名不是一个实体 per-se,它只是一个字符串集合,我只想在我的 OR 中添加第二个条件,即 return 如果任何别名匹配则为真相同的 legalNameQuery
搜索字符串
正如我之前提到的,如果我删除 OR
部分并且仅 运行 legalName 字符串匹配,它会起作用,但不起作用的是 [=19= 的第二部分] 将匹配别名
我终于成功了,不得不 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]]
)
)