使用带有参数的HQL选择表行

时间:2018-07-22 20:48:53

标签: java hibernate hql

我想使用此HQL查询来选择表行值:

String hql = "select e.token, e.name from Terminals e where e.token = ?";
Terminals terminal = entityManager
    .createQuery(hql, Terminals.class)
    .setParameter(0, terminalToken)
    .getSingleResult();

但我得到以下结果:

java.lang.IllegalArgumentException: Cannot create TypedQuery for query with more than one return using requested result type [org.api.entity.Terminals]

实现此目标的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

您的查询返回两个对象tokenname,而不是Terminals对象。

您可以使用:

Object[] obj = entityManager
    .createQuery(hql)
    .setParameter(0, terminalToken)
    .getSingleResult();

if(obj != null){
    Terminals terminal = new Terminals((String) obj[0], (String) obj[1]);
}

或者您可以在Terminals类中创建一个包含两个字段的构造函数:

public Terminals(String token, String name){
   this.token = token;
   this.name = name;
}

然后将您的代码更改为:

String hql = "select new com.package.Terminals(e.token, e.name) from Terminals e where e.token = ?";
Terminals terminal = entityManager
    .createQuery(hql, Terminals.class)
    .setParameter(0, terminalToken)
    .getSingleResult();

答案 1 :(得分:1)

IMO,您不应直接调用createQuery来分配给自定义对象。并且有可能返回列表。

Query query = entityManager.createQuery(hql).setParameter(0, "something");<br>
List<Object[]> terminals = query.getResultList();

并以索引为ff的对象作为示例:

        StudentDto dto = new StudentDto();
        for(Object[] a: std) {
            dto = new StudentDto();
            dto.setId((long) a[0]); //id
            dto.setName(a[1].toString()); //first name
            dto.setPassportNumber(a[2].toString()); //last name
        }