2016-08-11 80 views
0

我有具有legalName: String屬性Company實體,也是一個aliases: Set<String>性質(所以一到多) Company將父 每個alias字符串的aliases收集將是兒童Hibernate的子查詢

我成功地進行了一個查詢,返回所有與父類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 
    ) 
) 
} 

的別名並不是每本身的實體,它只是字符串的集合,我只是想在我可以添加第二個標準的返回true,如果任何一個別名相同legalNameQuery匹配搜索字符串

正如我前面提到的,如果我刪除OR部分,只是運行legalName字符串匹配,它的作品,什麼行不通是OR將匹配別名

+0

大概用'any(subquery)'?我只是不知道如何使子查詢返回集合中的任何字符串是否與'a like b'運算符匹配查詢 – dominicbri7

回答

0

我終於做到了工作的第二部分,必須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]] 
    ) 
)