2015-10-15 24 views
0

我有一種方法可以在用戶傳遞參數時搜索一個名稱。 現在我需要一種方法來告訴我員工在公司中的角色是什麼那個JPA查詢有什麼問題,需要通過特定名稱來找到一個用戶

想法是將這些數據插入到組合框中。

這是我曾經看到的姓名通過參數傳遞的方法:

public List<User> findbyName(String name) { 
    EntityManager em = getEntityManager(); 
    String sql = "select u from User u where UPPER(u.name) like UPPER ('" + name + "%')"; 
    List<User> u = null; 
    try { 
     u = (List<User>) em.createQuery(sql).getResultList(); 

    } catch (Exception e) { 

     return null;   
    } 
    return u; 
} 

這裏是方法,即時通訊試圖做的:

public List<User> findbyRole(){ 
    EntityManager em = getEntityManager(); 
      String sql = "select u from User u where UPPER(u.role) like (journalist)"; 
      List<User> u = null; 
    try { 
     u = (List<User>) em.createQuery(sql).getResultList(); 

    } catch (Exception e) { 

     return null;   
    } 
    return u; 
} 

代碼插入到組合框,這是正確的?

List <User> list= new UserJpaController().findbyRole(); 
    for(int i=0;i<lista.size();i++){ 
     combojournalist.addItem(list.get(i).getCargo()); 
} 
+0

你不應該捕捉異常沒有記錄錯誤:'} catch(Exception e){ return null; }'。你的查詢是錯誤的。 – Jens

+0

是的,需要看到,但方法「findbyName」工作正常,但方法「findbyRole」沒有返回任何內容,我有一個人作爲記者。任何想法爲什麼? – Janson

+0

應該引用'記者'嗎?不應該是'JOURNALIST'嗎? –

回答

0

如果你想在你的查詢中使用一個字符串journalist,您可能需要把它放到引號,或者把它作爲參數。否則,JPA會認爲journalist是別名,但在查詢中未定義這種別名。

所以您的查詢應該是這樣的(見周圍記者引號):

select u from User u where UPPER(u.role) like ('journalist') 

,或者如果您使用的參數,這始終是一個更好的選擇:

String sql = "select u from User u where UPPER(u.role) like (:role)"; 
List<User> u = em.createQuery(sql, User.class) 
     .setParameter("role", "journalist") 
     .getResultList(); 
+0

如果你在查詢中不使用通配符,你也可以使用'='而不是'like',就像這樣:UPPER(u.role)=:角色 – OndrejM

+0

Thx Ondre,現在工作。但我不明白參數如何在你的代碼中工作,你能告訴我怎麼做嗎?我從來沒有這樣用過 – Janson

+0

在JPQL中,你可以使用參數,它們就像變量一樣。你需要在冒號前加上這樣的變量(:),以便JPA知道它是一個命名參數。然後使用'query.setParameter'設置參數的值。通過這種方式,JPA確保該參數的值不會與其他JPQL代碼混合使用,即使它的值包含危險字符。 – OndrejM