我对JPA相当陌生,它是CriteriaBuilder/CriteriaQuery API:
我想查询一组对象的摘录(如下所示,我只选择结果中的元素n到m)
查询本身运行良好,我得到了预期的结果。
但是如果我尝试计算所有可能的结果,我会得到一个java。lang.IllegalArgumentException:
org.hibernate.hql.internal.ast.无效路径:'生成lias1.prop1'[选择计数(生成Alias0)从com.myompany.blablub.MyClass作为生成Alias0其中(1=1)和(生成lias1.prop1=:参数0)]"
final CriteriaQuery<MyClass> criteriaQuery = builder.createQuery(MyClass.class);
CriteriaQuery<Long> countQuery = builder.createQuery(Long.class);
countQuery.select(builder.count(countQuery.from(MyClass.class)));
Long totalCount = -1L;
List<MyClass> MyClassList;
Root<MyClass> root = criteriaQuery.from(MyClass.class);
if(myClassFilter != null) {
List<Predicate> predicates = new ArrayList<Predicate>();
if(myClassFilter.getProp1() != null) {
Join<MyClass, MyOtherClass> myJoin1 = root.join(MyClass_.prop1);
predicates.add(builder.equal(myJoin1.get(MyOtherClass_.blah), myClassFilter.getProp1() ));
}
if(myClassFilter.getProp2() != null) {
predicates.add(builder.equal(root.get(MyClass_.blubb), myClassFilter.getProp2() ));
}
if(myClassFilter.getProp3() != null) {
Join<MyClass, MyOtherClass> myJoin2 = root.join(MyClass_.foo);
predicates.add(builder.equal(myJoin2.get(MyOtherClass_.bar), myClassFilter.getProp3() ));
}
if (myClassFilter.getSpecialPropList() != null) {
if (myClassFilter.getSpecialPropList().length>0) {
Predicate orPredicates = builder.disjunction();
for (String specialProp : myClassFilter.getSpecialPropList()) {
Join<MyClass, specialProp> specialPropJoin = root.join(MyClass_.specialProps);
Predicate newPredicate = builder.equal(specialPropJoin.get(specialProp_.dudum), specialProp);
orPredicates = builder.or(orPredicates, newPredicate);
}
predicates.add(orPredicates);
}
}
Predicate finalPredicate = builder.conjunction();
for(Predicate p: predicates) {
finalPredicate = builder.and(finalPredicate, p);
}
criteriaQuery.select(root).where(finalPredicate);
countQuery.where(finalPredicate);
}
count = entityManager.createQuery(countQuery).getFirstResult();
TypedQuery<MyClass> typedQuery = entityManager.createQuery(criteriaQuery);
if(first >= 0) {
typedQuery.setFirstResult(first);
}
if(count > 0) {
typedQuery.setMaxResults(count);
}
MyClassList = typedQuery.getResultList();
我希望你能给我一个提示,告诉我我做错了什么。
我想我知道我的问题在哪里了。
只有当我使用连接时,行为才会发生。
没有连接的查询如下所示:
select count(generatedAlias0) from MyClass as generatedAlias0 where ( 1=1 ) and ( generatedAlias0.blubb=:param0 )
但当我想使用联接时,它是这样的:
select count(generatedAlias0) from MyClass as generatedAlias0 where ( 1=1 ) and ( generatedAlias1.blah=:param0 )
而没有计数的查询看起来像这样:
select generatedAlias0 from MyClass as generatedAlias0 inner join generatedAlias0.prop1 as generatedAlias1 where ( 1=1 ) and ( generatedAlias1.blah=:param0 )
它显然不知道generatedAlias1是什么,因为缺少了整个连接。有人知道我如何纠正这种行为吗?
您使用标准查询的根创建连接。您还需要使用CountQuery的根创建连接。
Root<MyClass> countRoot = countQuery.from(MyClass.class);
Join<MyClass, MyOtherClass> mycountJoin = countRoot.join(MyClass_.foo);
问题内容: 谁能给我一些关于如何将这种子查询放入提示?(我正在使用 JPA 2.0 - Hibernate 4.x ) -第二个选择将始终获得单个结果或null。 问题答案: 尝试类似以下示例的操作来创建子查询: 请注意,由于附近缺少IDE,因此该代码尚未经过测试。
问题内容: 我对JPA 2相当陌生,它是CriteriaBuilder / CriteriaQuery API: Java文档 在Java EE 6教程中 我想计算一个CriteriaQuery的结果而不实际检索它们。那有可能吗,我没有找到任何这样的方法,唯一的办法就是这样做: 那不可能是正确的方法… 有解决方案吗? 问题答案: 类型查询将返回。您要查询。 显然,您将希望使用示例中跳过的任何限制和
来自Teradata,我通常会创建一个包含一些变量的易失性表,我会在代码中使用这些变量。 例如。, 然后我会在SELECT WHERE子句中使用该表: 我试图在色调(Impala editor)中执行类似的操作,但遇到了一个错误: AnalysisException:第5行中的语法错误:未定义:来自表名隐藏^遇到:来自预期的:大小写、强制转换、默认值、存在、FALSE、IF、INTERVAL、NO
我有一个具有一-多关系的表,如下所示 城市->学校->老师->孩子 我的从城市检索子级的JPQL如下所示 这里关于Where子句的引用说明 “复合路径表达式使where子句功能极其强大。” 然而,在观察日志时,我意识到上面的查询正在执行奇怪的操作,例如 我试图理解我是否正确地定义了我的查询,如果Where的复合物确实如此强大,为什么我的查询如此低效。
问题内容: 我最近才刚开始使用SQLAlchemy,但仍无法解决某些概念。 归结为基本元素,我有两个这样的表(通过Flask-SQLAlchemy): 我将如何查询用户列表及其最新帖子(不包括无帖子的用户)。如果我使用的是SQL,则可以执行以下操作: 因此,我确切地知道“期望的” SQL可以达到我想要的效果,但是不知道如何在SQLAlchemy中“正确地”表达它。 编辑:如果很重要,我使用的是SQ
问题内容: 在命名查询的where子句中可能有一个like?我正在尝试执行以下操作,但出现异常 我尝试像在普通SQL中那样添加%,但是得到了异常编译。 任何指针,不胜感激! 谢谢 问题答案: 您不能在中添加%,但可以在为其分配参数的值中包含它。 如: