当前位置: 首页 > 知识库问答 >
问题:

Hibernate回迁,Multiselect-in-Criteria API不工作

洪弘毅
2023-03-14

我正在使用Hibernate Criteria API从DB加载数据,但是当使用multiselect并通过映射@OneToOne,@ManyToOne获取相关实体时

获取数据的代码


    private Session getSession() {
        return entityManager.unwrap(SessionImplementor.class);
    }

    @Override
    public Account getGatewayAccount(Long appId, String accountNumber) {

        Session session = getSession();

        CriteriaBuilder criteria = session.getCriteriaBuilder();
        CriteriaQuery<Account> query = criteria.createQuery(Account.class);
        Root<Account> from = query.from(Account.class);

        from.fetch(Account_.APP, JoinType.INNER);

        query.multiselect(from.get(Account_.ID), from.get(Account_.ACCOUNT_NUMBER))
                .where(criteria.equal(from.get(Account_.ACCOUNT_NUMBER), accountNumber),
                        criteria.equal(from.get(Account_.APP).get(App_.ID), appId));

        try {
            return session.createQuery(query)
                    .getSingleResult();
        } catch (NoResultException e) {
            return null;
        }
    }

我还尝试使用EntityGraph来加载以下数据

private Session getSession() {
        return entityManager.unwrap(SessionImplementor.class);
    }

    @Override
    public Account getGatewayAccount(Long appId, String accountNumber) {

        Session session = getSession();

        RootGraph<Account> entityGraph = session.createEntityGraph(Account.class);
        entityGraph.addAttributeNodes("app");

        CriteriaBuilder criteria = session.getCriteriaBuilder();
        CriteriaQuery<Account> query = criteria.createQuery(Account.class);
        Root<Account> from = query.from(Account.class);

        query.multiselect(from.get(Account_.ID), from.get(Account_.ACCOUNT_NUMBER))
                .where(criteria.equal(from.get(Account_.ACCOUNT_NUMBER), accountNumber),
                        criteria.equal(from.get(Account_.APP).get(App_.ID), appId));

        try {
            return session.createQuery(query)
                    .setHint("javax.persistence.fetchgraph", entityGraph)
                    .getSingleResult();
        } catch (NoResultException e) {
            return null;
        }
    }

我得到的例外是


org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.QueryException: query specified join fetching, 
but the owner of the fetched association was not present in the select list

我正在寻找一种方法,可以使用multiselect in select子句获取相关对象,并将数据作为POJO对象获取,而不像元组。

共有1个答案

孔鹤龄
2023-03-14

你想要的似乎是一个构造函数查询

  query.select(criteria.construct(Answer.class, from.get(Account_.ID), from.get(Account_.ACCOUNT_NUMBER))

这是通过在接受查询中定义的两个参数的已定义类上使用构造函数来工作的,因此绕过所有JPA挂钩;返回的是非托管POJO。由于这不是托管实体,因此获取图可能没有任何意义。

否则,您可以返回:

  query.select(from)

这将返回一个受管理的地址实例,并加载entityGraph中描述的所有属性。根据您的提供者的具体情况,entityGraph中未定义的所有内容都应保留为懒惰的,因此未进行蚀刻。

 类似资料:
  • 支持查询列表内容,支持排序,全选和反选 support multiselect or singleselect for object's displaying. can sort by object's property. can search option displaying in the select. select all and deselect. jquery ui theme.

  • 我的数据库中有几个表: games表:有team1、team2等列。这两列都引用了另一个表Team表:与players表具有一对多关系。 玩家表:与技能表有一对一的参考。 作为团队实体中的实体,我收集了FetchType设置为LAZY的玩家。 我正在进行选择查询以获得许多游戏。无论设置为获取类型(懒惰或渴望),都需要相当长的时间才能获取游戏的所有实体,因为它会加载两个团队,并且从DB日志中可以看到

  • 问题内容: 我有一个servlet,它为用户做一些工作,然后减少用户的信用。当我实时查看数据库中的用户信用时,如果有来自同一用户的许多并发请求,则由于并发控制,信用被错误地扣除。假设我有一台服务器,并且数据库管理处于hibernate状态。我正在使用事务控制来处理整个请求,请参见代码以获取详细信息。我有几个问题: 当面对来自同一用户的多个并发请求时,为什么db中的信用计数器到处跳?为什么我的交易控

  • 我只想使用hibernate envers来审计我的实体。我使用Envers-1.2.2.ga-hibernate-3.3.jar、Hibernate-Annotations-3.5.6-final.jar、Hibernate-Core-3.5.2-final.jar和Hibernate-JPA-2.0-API-1.0.0.final.jar。 我的实体在下面 user.java 这是我配置了en

  • Tree-Multiselect 可以用树形视图代替 select 元素,它可以实现复杂的嵌套选择。