Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用JPA读取集合属性?_Jpa_Criteria Api - Fatal编程技术网

如何使用JPA读取集合属性?

如何使用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

我有两个类,Account和Admin,具有多对多映射。 Admin类有Account类的集合,反之亦然

我想写一个查询,给定帐户id,将返回所有帐户管理员

以下是Account类的相关字段:

之后,我尝试运行TypedQuery,因为我正在尝试读取列表。这是尝试查询列表的第一次迭代:

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();
}