如何使用 Join Fetch 初始化 LazyCollection
How initialize a LazyCollection with Join Fetch
ProdutoValor 它是一个 table,其中包含与 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);
}
但是在这之后我有一个 nullPointer if try get Produto 这个列表的任何元素。例如: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 查询中,您必须使用实体名称而不是 table 名称
("SELECT e FROM produtovalor e JOIN FETCH e.produto")
应该是
("SELECT e FROM ProdutoValorETO e JOIN FETCH e.produto")
此外,除非必要,否则您应该避免使用 sql 本机查询,因为它会降低您的应用程序到不同数据源的可移植性
ProdutoValor 它是一个 table,其中包含与 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);
}
但是在这之后我有一个 nullPointer if try get Produto 这个列表的任何元素。例如: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 查询中,您必须使用实体名称而不是 table 名称
("SELECT e FROM produtovalor e JOIN FETCH e.produto")
应该是
("SELECT e FROM ProdutoValorETO e JOIN FETCH e.produto")
此外,除非必要,否则您应该避免使用 sql 本机查询,因为它会降低您的应用程序到不同数据源的可移植性