2014-11-04 154 views
1

取指没有返回结果在一个春天MVC应用程序,我写了下面的查询方法返回的名称与病人的列表:JPQL左连接使用Hibernate和MySQL像

@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(); 
} 

这是生产以下冬眠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中删除了where names1_.FAMILY like ?,并将缩短的sql放到MySQL命令行客户端中,我会得到四个结果,每个结果都有一个姓氏字段的值。

如何更改jpql,以便它生成一个hibernate查询,该查询在作为空字符串参数传递时返回四个结果?我希望结果集包含用户给出空输入时的每个结果,但在用户键入任何给定的文本输入时给出过滤结果。

回答

1

like未能做到您认为应该做的一切的典型原因是忘记在模式字符串中放置通配符。例如,如果要匹配以“代码”开头的所有用户名,则必须执行类似name like 'Code%'而不是name like 'Code'。您可以精确地控制您的谓词与您的字符串中仔细放置% s匹配的内容。

试试这个,看看所有实体不管什么价值家庭:

this.myappService.findPersonByLastName("%"); 

这是有点儿俗气拥有的findPersionByLastName调用者必须把在%通配符。更好的实现是让调用者指定他们要查找的姓​​氏,然后让构造查询的代码将通配符放在正确的位置。当你在寻找姓氏时,你可能会这样做:

query.setParameter("lnm", "%" + ln); 

这将匹配任何以传递给该方法的参数结尾的内容。

+0

以下工作:'query.setParameter(“lnm”,ln +“%”);'我没有使用您的代码,因为我想将它隔离在存储库中以最大化可重用性。但是我给了答案+1,因为你指出了正确的方向。谢谢。 – CodeMed 2014-11-04 22:27:12