2014-11-04 67 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