在使用hibernate和MySQL的spring mvc app中,我编写了以下查询方法来返回患者姓名列表:
@SuppressWarnings("unchecked")
public Collection<Person> findPersonByLastName(String ln) throws DataAccessException{
Query query = this.em.createQuery("SELECT DISTINCT pers FROM rimPerson pers left join fetch pers.names nm WHERE nm.family LIKE :lnm");
query.setParameter("lnm", ln);
return query.getResultList();
}
这产生了以下hibernate sql:
Hibernate:
select distinct
person0_.hppid as hppid1_340_0_,
names1_.HJID as HJID1_89_1_,
person0_2_.classCode_HJID as classCod2_339_0_,
person0_1_.administrativeGenderCode_HJID as administ2_341_0_,
person0_1_.birthTime_HJID as birthTim3_341_0_,
names1_.DELIMITER_ as DELIMITE2_89_1_,
names1_.FAMILY as FAMILY3_89_1_,
names1_.named_entity_hppid as named5_89_1_,
names1_.SUFFIX as SUFFIX4_89_1_,
names1_.name_entity_HJID as name9_340_0__,
names1_.HJID as HJID1_89_0__
from
rim_person person0_ inner join rim_living_subject person0_1_ on person0_.hppid=person0_1_.hppid
inner join rim_entity person0_2_ on person0_.hppid=person0_2_.hppid
inner join rim_infrastructure_root person0_3_ on person0_.hppid=person0_3_.hppid
left outer join EN names1_ on person0_.hppid=names1_.name_entity_HJID
where names1_.FAMILY like ?
当我使用以下命令调用上述jpql方法时,它返回零结果:
this.myappService.findPersonByLastName("");
当我将上面生成的hibernate代码切换到MySQL命令行客户端并将?
替换为''
时,我也得到零结果。
但是,如果我从上面的hibernate生成的sql中删除where names1_.FAMILY like ?
并将缩短的sql放入MySQL命令行客户端,我会得到四个结果,每个结果都有一个lastname字段的值。
如何更改jpql以便生成一个hibernate查询,当``作为空字符串参数传递时返回四个结果?我希望结果集包含每个结果时user提供空输入,但在用户键入任何给定文本输入时提供过滤结果。
答案 0 :(得分:1)
like
未能按照您认为应该做的做法的典型原因是忘记在模式字符串中放置通配符。例如,如果要匹配以“代码”开头的所有用户名,则必须执行name like 'Code%'
,而不是name like 'Code'
之类的操作。您可以通过在字符串中小心放置%
来精确控制谓词匹配的内容。
尝试使用此功能查看所有实体,无论系列中的值是什么:
this.myappService.findPersonByLastName("%");
让findPersionByLastName
的调用者必须放入%
通配符,这有点俗气。更好的实现是让调用者指定他们要查找的姓氏,然后让构造查询的代码将通配符放在正确的位置。当您在寻找姓氏时,您可能会这样做:
query.setParameter("lnm", "%" + ln);
这将匹配以传递给方法的参数结束的任何内容。