java - 如何使用 Join Fetch 初始化 LazyCollection

标签 java hibernate hibernate-criteria

ProdutoValor 它是一个包含与 Produto 的多对一关系的表。这是我获取 ProdutoValor 中所有数据的方法:

    @Override
    public List<ProdutoValorETO> getAll() {
        String query = " SELECT * FROM produtovalor WHERE ativo = TRUE; ";
        SQLQuery eQuery = getCurrentSession().createSQLQuery(query).addEntity(ProdutoValorETO.class);
        return CastUtils.castList(eQuery.list(), ProdutoValorETO.class);
    }

但是在此之后,如果尝试获取此列表中任何元素的 Produto,我就会得到一个 nullPointer。例如:pv.getProduto().getCodigo()(请注意,pv 是此列表的一个元素,而 produto 为 null)

我读到 JOIN FETCH 可以在一次查询中初始化 Produto。所以我尝试了:

    @Override
    public List<ProdutoValorETO> getAll() {
        Query query =
                getCurrentSession().createQuery("SELECT e FROM produtovalor e JOIN FETCH e.produto");
        return query.list();
    }

现在我得到一个 querySyntaxException:

Caused by: org.hibernate.hql.ast.QuerySyntaxException: produtovalor is not mapped [SELECT e FROM produtovalor e JOIN FETCH e.produto]
    at org.hibernate.hql.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:158)
    at org.hibernate.hql.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:87)
    at org.hibernate.hql.ast.tree.FromClause.addFromElement(FromClause.java:71)
    at org.hibernate.hql.ast.HqlSqlWalker.createFromElement(HqlSqlWalker.java:295)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3228)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromElementList(HqlSqlBaseWalker.java:3112)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromClause(HqlSqlBaseWalker.java:720)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:571)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:288)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:231)
    at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:231)
    at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:162)
    at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:113)
    at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:77)
    at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:56)
    at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:72)
    at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:133)
    at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:112)
    at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1624)

类(class):

@Entity
@Table(name = "produtoValor")
public class ProdutoValorETO extends BaseTO {

    @Id
    @Column(name = "id", nullable = false)
    @SequenceGenerator(name = "id", sequenceName = "produto_valor_sequence", allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "id")
    private Long id;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "idLojista")
    private LojistaTO lojista;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "idProduto")
    private ProdutoETO produto;

    @Column
    private Integer quantidadeMinima;

    @Column
    private Integer quantidadeMaxima;

    @Column
    private Double valor;

    @Column
    private Integer estoque;

    @Column
    private Integer estoqueComprometido;

    //getters and setters
}

如何通过 Produto 获取 ProdutoValor 列表?

最佳答案

该错误是关于 hibernate 提示他找不到“produtovalor”实体。

在 Hql 查询中,您必须使用实体名称而不是表名称

("SELECT e FROM produtovalor e JOIN FETCH e.produto")

应该是

("SELECT e FROM ProdutoValorETO e JOIN FETCH e.produto")

此外,除非必要,否则应避免使用 SQL native 查询,因为它会降低应用程序到不同数据源的可移植性

关于java - 如何使用 Join Fetch 初始化 LazyCollection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48646061/

相关文章:

java - 如何将图像添加到 JavaFx TableView 列中

java - 为什么 Hibernate 的 createQuery 和 createCriteria 返回不同数量的对象?

java - Hibernate-Criteria:在 'ON Clause' 中使用多个条件

java - Spring设置抽象bean属性值

java - OpenCV 安卓工作室

hibernate - 如何配置 Hibernate 以使用 DBCP2 连接池?

java - hibernate 条件中的 SQL 'case when'

java - 将微调器值与数组值相乘

java - 默认情况下枚举的实例是静态的吗?

Hibernate 和涉及特定行的算术