那个JPA查询有什么问题,需要通过特定名称来找到一个用户

问题描述:

我有一种方法可以在用户传递参数时搜索一个名称。 现在我需要一种方法来告诉我员工在公司中的角色是什么那个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'吗? –

如果你想在你的查询中使用一个字符串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