[英]jpql left join fetch not returning results for like
在使用hibernate和MySQL的spring mvc應用程序中,我編寫了以下查詢方法以返回帶有患者的姓名列表:
@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("");
當將上面生成的休眠代碼剪切並粘貼到MySQL命令行客戶端並替換時,我也得到零結果?
用''
。
但是,如果我刪除where names1_.FAMILY like ?
從上面的休眠生成的sql並將縮短的sql放入MySQL命令行客戶端,我得到了四個結果,每個結果都有一個用於lastname字段的值。
如何更改jpql,以便生成一個休眠查詢,當將``作為空字符串參數傳遞時,它返回四個結果? 我希望結果集在用戶提供空輸入時包括所有結果,但是在用戶鍵入任何給定的文本輸入時提供過濾后的結果。
like
未能完成您認為應該做的事情的典型原因是忘記在模式字符串中放入通配符。 例如,如果要匹配以'Code'開頭的所有用戶名,則必須執行name like 'Code%'
類的name like 'Code%'
,而不是執行name like 'Code'
。 您可以通過在字符串中小心地放置%
s來精確控制謂詞匹配的內容。
嘗試使用此方法查看所有實體,而不管家庭的價值如何:
this.myappService.findPersonByLastName("%");
讓findPersionByLastName
的調用者必須放入%
通配符有點俗氣。 一個更好的實現是讓調用者指定他們要查找的姓氏,然后將構造查詢的代碼放在正確的位置。 當您尋找姓氏時,您可以執行以下操作:
query.setParameter("lnm", "%" + ln);
這將匹配任何以傳遞給方法的參數結尾的東西。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.