我想使用此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]
实现此目标的正确方法是什么?
答案 0 :(得分:2)
您的查询返回两个对象token
和name
,而不是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
}