关于我之前的问题,我想确保加载所有子对象,因为我有一个可能需要访问数据的多个线程(从而避免延迟加载异常).我知道这样做的方法是在查询中使用"fetch"关键字(EJB QL).像这样:
select distinct o from Order o left join fetch o.orderLines
Run Code Online (Sandbox Code Playgroud)
假设一个模型的Order类中包含一组OrderLines.
我的问题是,似乎需要"distinct"关键字,否则我似乎会Order为每个关键字取回一个OrderLine.我做对了吗?
也许更重要的是,有没有办法拉入所有儿童物品,无论多深?我们有大约10-15个类,对于服务器,我们将需要加载的所有东西......我正在避免使用,FetchType.EAGER因为这意味着它总是渴望,特别是Web前端加载一切 - 但也许这是要走的路 - 是你做什么?我似乎记得我们之前尝试过这个,然后得到非常慢的网页 - 但也许这意味着我们应该使用二级缓存?
我正在努力让以下NamedQuery工作:
@NamedQuery(name="MyEntity.findByUser", query="SELECT m FROM MyEntity m WHERE m.owner = :user OFFSET :offset LIMIT :limit")
Run Code Online (Sandbox Code Playgroud)
问题是,这会导致Hibernate在服务器启动时使用以下堆栈跟踪进行爆炸:
[INFO] [talledLocalContainer] java.lang.NullPointerException
[INFO] [talledLocalContainer] at org.hibernate.hql.ast.ParameterTranslationsImpl.getNamedParameterExpectedType(ParameterTranslationsImpl.java:63)
[INFO] [talledLocalContainer] at org.hibernate.engine.query.HQLQueryPlan.buildParameterMetadata(HQLQueryPlan.java:296)
[INFO] [talledLocalContainer] at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:97)
[INFO] [talledLocalContainer] at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:56)
[INFO] [talledLocalContainer] at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:72)
[INFO] [talledLocalContainer] at org.hibernate.impl.SessionFactoryImpl.checkNamedQueries(SessionFactoryImpl.java:400)
[INFO] [talledLocalContainer] at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:351)
[INFO] [talledLocalContainer] at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1291)
[INFO] [talledLocalContainer] at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:713)
[INFO] [talledLocalContainer] at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:121)
[INFO] [talledLocalContainer] at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:83)
[INFO] [talledLocalContainer] at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:60)
(...)
Run Code Online (Sandbox Code Playgroud)
经过一些反复试验后,我发现用文字值(分别为0和10)替换":offset"和":limit"工作正常.是否有这样的原因,有没有办法让命名参数在我的查询中工作?
我已经看到一些其他示例使用定位参数来动态设置命名查询中的偏移量和限制值,但我宁愿不让我的代码退化为一堆难以理解的query.setParameter(1, "someValue");废话.命名参数应该摆脱那种垃圾代码.
我正在使用 oracle10g 数据库和 eclipselink,我需要从表中获取最后插入的键,所以我创建了这个查询
javax.persistence.Query q =
em.createQuery("SELECT nvl(MAX(c.myAtt),0) " +
"from myTable as c");
return Integer.parseInt(q.getSingleResult().toString()); `
Run Code Online (Sandbox Code Playgroud)
但是当表是空的(有时它可能会变空)时,我得到了 ILEGAL ARGUMENT EXCEPTION,原因:JPQL 异常,详细信息:“在 EntityManager 中创建查询时发生异常”。我在做什么错?