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]]
    )
)