【问题标题】:Hibernate subquery of String collection match字符串集合匹配的休眠子查询
【发布时间】:2016-08-11 16:44:17
【问题描述】:

我有一个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 的第二部分将匹配别名

【问题讨论】:

  • 可能是any(subquery) ?我只是不确定如何使子查询返回集合中的任何字符串是否与 a like b 运算符的查询匹配

标签: java hibernate scala jpa criteria-api


【解决方案1】:

我终于成功了,不得不joinaliases

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-01
    • 2011-12-02
    • 1970-01-01
    • 2012-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    相关资源
    最近更新 更多