Java Persistence Criteria使用multiselect获取集合



我有一个由id和其他属性的生命体征列表组成的类

public class Patient
{
private Integer Id;
private String FirstName;
private String LastName;
private List<Vital> Vitals;
public Patient(Integer id, List<Vital> vitals)
{
this.Id = id;
this.setVitals(vitals);
}
main()
{
Session session = Hibernate.openSession();
CriteriaBuilder cb = session.getCriteriaBuilder();
CriteriaQuery<Patient> cq = cb.createQuery(Patient.class);
Root<Patient> root = cq.from(Patient.class);
cq.multiselect(root.get("Id"), root.get("Vitals"));
List<Patient> patients = session.createQuery(cq).getResultList();
session.close();
}
}

但是上面提到的代码产生了一个未定义的正确构造函数的异常

线程中的异常"主";java.lang.IollegalArgumentException:org.hibernate.hql.internal.ast.QuerySyntaxException:无法在类[com.bk.Patient]上找到合适的构造函数。预期参数为:int,java.util.Collection[从com.bk.Ppatient中选择新的com.bk.PPatient(generatedAlias0.Id,generatedAlias0.Vitals(作为generatedAlias 0]位于org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:138(

如果我将构造函数更改为

public PatientEncounter(Integer id, java.util.Collection vitals)
{
this.Id = id;
//      this.setVitals(vitals);
}

异常转换为

线程中的异常"主";javax.persistence.PersistenceException:org.hibernate.exception.SQLGrammaException:无法提取ResultSet引起原因:com.microsoft.sqlserver.jdbc.SQLServerException:关键字"as"附近的语法不正确。

以下链接问题1和问题2

CriteriaQuery<Tuple> cq = cb.createTupleQuery();

Root<Patient> root = cq.from(Patient.class);

Path<String> namePath = root.get("Vitals");
Path<Integer> idPath = root.get("Id");

cq.multiselect(idPath , namePath);

session.createQuery(cq).getResultList().stream();

也会产生相同的异常

线程中的异常"主";javax.persistence.PersistenceException:org.hibernate.exception.SQLGrammaException:无法提取ResultSet引起原因:com.microsoft.sqlserver.jdbc.SQLServerException:关键字"as"附近的语法不正确。

我做错了什么,如何修复?

附言:如果我只获取属性,那么代码运行良好。只有提取集合才会导致异常

无法选择集合。你只能选择其中的元素。你可能想要的是为集合创建一个提取,即

Session session = Hibernate.openSession();
CriteriaBuilder cb = session.getCriteriaBuilder();
CriteriaQuery<Patient> cq = cb.createQuery(Patient.class);
Root<Patient> root = cq.from(Patient.class);
root.fetch("Vitals");
List<Patient> patients = session.createQuery(cq).getResultList();

最新更新