如何使用JPA读取集合属性?
我有两个类,Account和Admin,具有多对多映射。 Admin类有Account类的集合,反之亦然 我想写一个查询,给定帐户id,将返回所有帐户管理员 以下是Account类的相关字段: 之后,我尝试运行TypedQuery,因为我正在尝试读取列表。这是尝试查询列表的第一次迭代:如何使用JPA读取集合属性?,jpa,criteria-api,Jpa,Criteria Api,我有两个类,Account和Admin,具有多对多映射。 Admin类有Account类的集合,反之亦然 我想写一个查询,给定帐户id,将返回所有帐户管理员 以下是Account类的相关字段: 之后,我尝试运行TypedQuery,因为我正在尝试读取列表。这是尝试查询列表的第一次迭代: private static List<Admin> readAccountAdmins(Long accountId) { CriteriaBuilder cb = JPA.em().get
private static List<Admin> readAccountAdmins(Long accountId) {
CriteriaBuilder cb = JPA.em().getCriteriaBuilder();
CriteriaQuery<List<Admin>> cq = cb.createQuery((Class<List<Admin>>)(Class<?>)(Collection.class));
Root<Account> root = cq.from(Account.class);
Predicate idPredicate = cb.equal(root.get(Account_.id), accountId);
cq.select(root.get(Account_.users)).where(idPredicate);
TypedQuery<List<Admin>> typedQuery = JPA.em().createQuery(cq);
return typedQuery.getSingleResult(); // exception thrown here
}
现在,这个函数起作用了,但我的问题是为什么?
为什么编译器决定getResultList返回的值与实际返回的值不同?当您仔细查看数据库时,这可能是有意义的。TypeQuery返回实体,因此基本上是表中的行。列表是实体的集合,因此即使您的帐户将列表作为字段,查询仍将返回列表实体,而不是列表,因为列表不是实体
我希望这是有意义的。我最终使用了一个与这里的答案类似的函数:,没有进行任何转换。我仍然想知道为什么我需要在我原来的工作功能铸造:它是。我想我需要一段时间才能完全理解,但每次我读到你的答案都会更有意义。谢谢
private static List<Admin> readAccountAdmins(Long accountId) {
CriteriaBuilder cb = JPA.em().getCriteriaBuilder();
CriteriaQuery<Admin> cq = cb.createQuery(Admin.class);
Root<Account> root = cq.from(Account.class);
Predicate idPredicate = cb.equal(root.get(Account_.id), accountId);
cq.multiselect(root.get(Account_.users)).where(idPredicate);
TypedQuery<Admin> typedQuery = JPA.em().createQuery(cq); // exception thrown here
return typedQuery.getResultList();
}
private static List<Admin> readAccountAdmins(Long accountId) {
CriteriaBuilder cb = JPA.em().getCriteriaBuilder();
CriteriaQuery<List<Admin>> cq = cb.createQuery((Class<List<Admin>>)(Class<?>)(Collection.class));
Root<Account> root = cq.from(Account.class);
Predicate idPredicate = cb.equal(root.get(Account_.id), accountId);
cq.select(root.get(Account_.users)).where(idPredicate);
TypedQuery<List<Admin>> typedQuery = JPA.em().createQuery(cq);
return typedQuery.getSingleResult(); // exception thrown here
}
private static List<Admin> readAccountAdmins(Long accountId) {
CriteriaBuilder cb = JPA.em().getCriteriaBuilder();
CriteriaQuery<List<Admin>> cq = cb.createQuery((Class<List<Admin>>)(Class<?>)(Collection.class));
Root<Account> root = cq.from(Account.class);
Predicate idPredicate = cb.equal(root.get(Account_.id), accountId);
cq.select(root.get(Account_.users)).where(idPredicate);
TypedQuery<List<Admin>> typedQuery = JPA.em().createQuery(cq);
return (List) typedQuery.getResultList();
}