mirror of
https://github.com/querydsl/querydsl.git
synced 2026-06-30 21:08:30 +08:00
#765731 : fixed count
This commit is contained in:
parent
cc63060050
commit
49b9895d59
@ -6,6 +6,8 @@
|
||||
package com.mysema.query.jpa;
|
||||
|
||||
import com.mysema.query.DefaultQueryMetadata;
|
||||
import com.mysema.query.JoinExpression;
|
||||
import com.mysema.query.JoinType;
|
||||
import com.mysema.query.QueryMetadata;
|
||||
import com.mysema.query.support.DetachableQuery;
|
||||
import com.mysema.query.types.CollectionExpression;
|
||||
@ -13,6 +15,8 @@ import com.mysema.query.types.EntityPath;
|
||||
import com.mysema.query.types.MapExpression;
|
||||
import com.mysema.query.types.Path;
|
||||
import com.mysema.query.types.Predicate;
|
||||
import com.mysema.query.types.query.NumberSubQuery;
|
||||
import com.mysema.query.types.template.NumberTemplate;
|
||||
|
||||
/**
|
||||
* Abstract superclass for SubQuery implementations
|
||||
@ -35,6 +39,19 @@ public class AbstractJPQLSubQuery<Q extends AbstractJPQLSubQuery<Q>> extends Det
|
||||
super.queryMixin.setSelf((Q)this);
|
||||
this.queryMixin = (JPQLQueryMixin<Q>) super.queryMixin;
|
||||
}
|
||||
|
||||
@Override
|
||||
public NumberSubQuery<Long> count(){
|
||||
StringBuilder count = new StringBuilder();
|
||||
for (JoinExpression join : queryMixin.getMetadata().getJoins()){
|
||||
if (join.getType() == JoinType.DEFAULT){
|
||||
count.append(count.length() == 0 ? "count(" : ", ");
|
||||
count.append(join.getTarget().toString());
|
||||
}
|
||||
}
|
||||
count.append(")");
|
||||
return unique(NumberTemplate.create(Long.class, count.toString()));
|
||||
}
|
||||
|
||||
public Q from(EntityPath<?>... o) {
|
||||
return queryMixin.from(o);
|
||||
|
||||
@ -37,8 +37,6 @@ public class JPQLSerializer extends SerializerBase<JPQLSerializer> {
|
||||
Ops.LT, Ops.LOE, Ops.GT, Ops.GOE, Ops.BETWEEN,
|
||||
Ops.BEFORE, Ops.AFTER, Ops.BOE, Ops.AOE));
|
||||
|
||||
private static final String SELECT_COUNT_DISTINCT = "select count(distinct ";
|
||||
|
||||
private static final String COMMA = ", ";
|
||||
|
||||
private static final String DELETE = "delete ";
|
||||
@ -55,6 +53,8 @@ public class JPQLSerializer extends SerializerBase<JPQLSerializer> {
|
||||
|
||||
private static final String SELECT_COUNT = "select count(";
|
||||
|
||||
private static final String SELECT_COUNT_DISTINCT = "select count(distinct ";
|
||||
|
||||
private static final String SELECT_DISTINCT = "select distinct ";
|
||||
|
||||
private static final String SET = "\nset ";
|
||||
|
||||
@ -208,25 +208,35 @@ public abstract class AbstractStandardTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void Any_And(){
|
||||
public void Any_And_Lt(){
|
||||
assertEquals(1, catQuery().where(cat.kittens.any().name.eq("Ruth123"), cat.kittens.any().bodyWeight.lt(10.0)).count());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void Any_And_Gt(){
|
||||
assertEquals(0, catQuery().where(cat.kittens.any().name.eq("Ruth123"), cat.kittens.any().bodyWeight.gt(10.0)).count());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void Aggregates_UniqueResult(){
|
||||
// uniqueResult
|
||||
public void Aggregates_UniqueResult_Min(){
|
||||
assertEquals(Integer.valueOf(1), catQuery().uniqueResult(cat.id.min()));
|
||||
assertEquals(Integer.valueOf(6), catQuery().uniqueResult(cat.id.max()));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void Aggregates_List(){
|
||||
// list
|
||||
public void Aggregates_UniqueResult_Max(){
|
||||
assertEquals(Integer.valueOf(6), catQuery().uniqueResult(cat.id.max()));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void Aggregates_List_Min(){
|
||||
assertEquals(Integer.valueOf(1), catQuery().list(cat.id.min()).get(0));
|
||||
assertEquals(Integer.valueOf(6), catQuery().list(cat.id.max()).get(0));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void Aggregates_List_Max(){
|
||||
assertEquals(Integer.valueOf(6), catQuery().list(cat.id.max()).get(0));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void DistinctResults(){
|
||||
System.out.println("-- list results");
|
||||
@ -245,21 +255,6 @@ public abstract class AbstractStandardTest {
|
||||
assertEquals(1, catQuery().listDistinct(cat.birthdate).size());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void DistinctResults2(){
|
||||
SearchResults<Date> res = catQuery().limit(2).listResults(cat.birthdate);
|
||||
assertEquals(2, res.getResults().size());
|
||||
assertEquals(6l, res.getTotal());
|
||||
System.out.println();
|
||||
|
||||
res = catQuery().limit(2).distinct().listResults(cat.birthdate);
|
||||
assertEquals(1, res.getResults().size());
|
||||
assertEquals(1l, res.getTotal());
|
||||
System.out.println();
|
||||
|
||||
assertEquals(1, catQuery().distinct().list(cat.birthdate).size());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void In(){
|
||||
catQuery().where(cat.id.in(Arrays.asList(1,2,3))).count();
|
||||
@ -268,7 +263,6 @@ public abstract class AbstractStandardTest {
|
||||
|
||||
@Test
|
||||
public void StartsWith(){
|
||||
// startsWith
|
||||
assertEquals(1, catQuery().where(cat.name.startsWith("R")).count());
|
||||
assertEquals(0, catQuery().where(cat.name.startsWith("X")).count());
|
||||
assertEquals(1, catQuery().where(cat.name.startsWithIgnoreCase("r")).count());
|
||||
@ -276,7 +270,6 @@ public abstract class AbstractStandardTest {
|
||||
|
||||
@Test
|
||||
public void EndsWith(){
|
||||
// endsWith
|
||||
assertEquals(1, catQuery().where(cat.name.endsWith("h123")).count());
|
||||
assertEquals(0, catQuery().where(cat.name.endsWith("X")).count());
|
||||
assertEquals(1, catQuery().where(cat.name.endsWithIgnoreCase("H123")).count());
|
||||
@ -284,7 +277,6 @@ public abstract class AbstractStandardTest {
|
||||
|
||||
@Test
|
||||
public void Contains1(){
|
||||
// contains
|
||||
assertEquals(1, catQuery().where(cat.name.contains("eli")).count());
|
||||
}
|
||||
|
||||
@ -295,20 +287,17 @@ public abstract class AbstractStandardTest {
|
||||
|
||||
@Test
|
||||
public void Length(){
|
||||
// length
|
||||
assertEquals(6, catQuery().where(cat.name.length().gt(0)).count());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void IndexOf(){
|
||||
// indexOf
|
||||
assertEquals(Integer.valueOf(0), catQuery().where(cat.name.eq("Bob123")).uniqueResult(cat.name.indexOf("B")));
|
||||
assertEquals(Integer.valueOf(1), catQuery().where(cat.name.eq("Bob123")).uniqueResult(cat.name.indexOf("o")));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void StringOperations(){
|
||||
// case-sensitivity
|
||||
if (!getTarget().equals(Target.MYSQL)){ // NOTE : locate in MYSQL is case-insensitive
|
||||
assertEquals(0, catQuery().where(cat.name.startsWith("r")).count());
|
||||
assertEquals(0, catQuery().where(cat.name.endsWith("H123")).count());
|
||||
@ -318,27 +307,23 @@ public abstract class AbstractStandardTest {
|
||||
|
||||
@Test
|
||||
public void Limit(){
|
||||
// limit
|
||||
List<String> names1 = Arrays.asList("Allen123","Bob123");
|
||||
assertEquals(names1, catQuery().orderBy(cat.name.asc()).limit(2).list(cat.name));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void Limit2(){
|
||||
// limit
|
||||
assertEquals(Collections.singletonList("Allen123"), catQuery().orderBy(cat.name.asc()).limit(1).list(cat.name));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void Offset(){
|
||||
// offset
|
||||
List<String> names2 = Arrays.asList("Felix123","Mary123","Ruth123","Some");
|
||||
assertEquals(names2, catQuery().orderBy(cat.name.asc()).offset(2).list(cat.name));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void Limit_and_offset(){
|
||||
// limit + offset
|
||||
List<String> names3 = Arrays.asList("Felix123","Mary123");
|
||||
assertEquals(names3, catQuery().orderBy(cat.name.asc()).limit(2).offset(2).list(cat.name));
|
||||
}
|
||||
|
||||
@ -17,12 +17,32 @@ public class CastTest extends AbstractQueryTest {
|
||||
private static NumberExpression<Integer> expr = new NumberPath<Integer>(Integer.class,"int");
|
||||
|
||||
@Test
|
||||
public void NumericCast() {
|
||||
public void Byte() {
|
||||
assertEquals(Byte.class, expr.byteValue().getType());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void Double() {
|
||||
assertEquals(Double.class, expr.doubleValue().getType());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void Float() {
|
||||
assertEquals(Float.class, expr.floatValue().getType());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void Integer() {
|
||||
assertEquals(Integer.class, expr.intValue().getType());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void Long() {
|
||||
assertEquals(Long.class, expr.longValue().getType());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void Short() {
|
||||
assertEquals(Short.class, expr.shortValue().getType());
|
||||
}
|
||||
|
||||
|
||||
@ -12,14 +12,18 @@ import com.mysema.query.jpa.domain.Cat;
|
||||
public class CollectionTest extends AbstractQueryTest{
|
||||
|
||||
@Test
|
||||
public void InElements(){
|
||||
public void Constant_InElements(){
|
||||
assertToString(":a1 in elements(cat.kittensSet)", cat.kittensSet.contains(new Cat()));
|
||||
assertToString(":a1 in elements(cat.kittens)", cat.kittens.contains(new Cat()));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void Path_InElements(){
|
||||
assertToString("cat in elements(cat1.kittens)", cat.in(cat1.kittens));
|
||||
assertToString("cat in elements(cat1.kittensSet)", cat.in(cat1.kittensSet));
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void CollectionOperations() {
|
||||
// HQL functions that take collection-valued path expressions: size(),
|
||||
|
||||
@ -9,6 +9,8 @@ import static org.junit.Assert.assertEquals;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import com.mysema.query.domain.QCat;
|
||||
|
||||
public class SubQueryTest extends AbstractQueryTest{
|
||||
|
||||
@Test(expected=IllegalArgumentException.class)
|
||||
@ -17,21 +19,37 @@ public class SubQueryTest extends AbstractQueryTest{
|
||||
}
|
||||
|
||||
@Test
|
||||
public void Serialization(){
|
||||
public void Single_Source(){
|
||||
JPQLSubQuery query = sub();
|
||||
|
||||
query.from(cat);
|
||||
assertEquals("from Cat cat", query.toString());
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void Multiple_Sources(){
|
||||
JPQLSubQuery query = sub();
|
||||
query.from(cat);
|
||||
query.from(fatcat);
|
||||
assertEquals("from Cat cat, Cat fatcat", query.toString());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void Joins(){
|
||||
public void InnerJoin(){
|
||||
assertEquals("from Cat cat\n inner join cat.mate", sub().from(cat).innerJoin(cat.mate).toString());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void LeftJoin(){
|
||||
assertEquals("from Cat cat\n left join cat.mate", sub().from(cat).leftJoin(cat.mate).toString());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void FullJoin(){
|
||||
assertEquals("from Cat cat\n full join cat.mate", sub().from(cat).fullJoin(cat.mate).toString());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void Join(){
|
||||
assertEquals("from Cat cat\n join cat.mate", sub().from(cat).join(cat.mate).toString());
|
||||
}
|
||||
|
||||
@ -64,4 +82,31 @@ public class SubQueryTest extends AbstractQueryTest{
|
||||
assertToString("not exists (select 1 from Cat cat where cat.weight < :a1)", sub().from(cat).where(cat.weight.lt(1)).unique(cat).notExists());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void Count() {
|
||||
assertToString("(select count(cat) from Cat cat)", sub().from(cat).count());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void Count_Via_List(){
|
||||
assertToString("(select count(cat) from Cat cat)", sub().from(cat).list(cat).count());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void Count_Name() {
|
||||
assertToString("(select count(cat.name) from Cat cat)", sub().from(cat).list(cat.name).count());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void Count_Multiple_Sources() {
|
||||
QCat other = new QCat("other");
|
||||
assertToString("(select count(cat, other) from Cat cat, Cat other)", sub().from(cat, other).count());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void Count_Multiple_Sources_Via_List() {
|
||||
QCat other = new QCat("other");
|
||||
assertToString("(select count(cat, other) from Cat cat, Cat other)", sub().from(cat, other).list(cat, other).count());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -31,6 +31,8 @@ import com.mysema.testutil.HibernateTestRunner;
|
||||
@HibernateConfig("derby.properties")
|
||||
public class DerbySQLTest {
|
||||
|
||||
private SAnimal cat = new SAnimal("cat");
|
||||
|
||||
private static final SQLTemplates derbyTemplates = new DerbyTemplates();
|
||||
|
||||
private Session session;
|
||||
@ -55,45 +57,65 @@ public class DerbySQLTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void ScalarQueries(){
|
||||
SAnimal cat = new SAnimal("cat");
|
||||
|
||||
// count
|
||||
public void Count(){
|
||||
assertEquals(6l, query().from(cat).where(cat.dtype.eq("C")).count());
|
||||
|
||||
// countDistinct
|
||||
}
|
||||
|
||||
@Test
|
||||
public void CountDistinct(){
|
||||
assertEquals(6l, query().from(cat).where(cat.dtype.eq("C")).countDistinct());
|
||||
|
||||
// list
|
||||
}
|
||||
|
||||
@Test
|
||||
public void List(){
|
||||
assertEquals(6, query().from(cat).where(cat.dtype.eq("C")).list(cat.id).size());
|
||||
|
||||
// list with limit
|
||||
}
|
||||
|
||||
@Test
|
||||
public void List_With_Limit(){
|
||||
assertEquals(3, query().from(cat).limit(3).list(cat.id).size());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void List_With_Offset(){
|
||||
assertEquals(3, query().from(cat).offset(3).list(cat.id).size());
|
||||
}
|
||||
|
||||
// list with offset
|
||||
assertEquals(3, query().from(cat).offset(3).list(cat.id).size());
|
||||
|
||||
// list with limit and offset
|
||||
assertEquals(3, query().from(cat).offset(3).limit(3).list(cat.id).size());
|
||||
|
||||
// list multiple
|
||||
print(query().from(cat).where(cat.dtype.eq("C")).list(cat.id, cat.name, cat.bodyweight));
|
||||
|
||||
// listResults
|
||||
@Test
|
||||
public void List_Limit_And_Offset(){
|
||||
assertEquals(3, query().from(cat).offset(3).limit(3).list(cat.id).size());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void List_Multiple(){
|
||||
print(query().from(cat).where(cat.dtype.eq("C")).list(cat.id, cat.name, cat.bodyweight));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void List_Results(){
|
||||
SearchResults<String> results = query().from(cat).limit(3).orderBy(cat.name.asc()).listResults(cat.name);
|
||||
assertEquals(Arrays.asList("Beck","Bobby","Harold"), results.getResults());
|
||||
assertEquals(6l, results.getTotal());
|
||||
|
||||
// unique Result
|
||||
query().from(cat).limit(1).uniqueResult(cat.id);
|
||||
|
||||
query().from(cat).limit(1).uniqueResult(new Expression[]{cat.id});
|
||||
|
||||
// single Result
|
||||
query().from(cat).singleResult(cat.id);
|
||||
|
||||
query().from(cat).singleResult(new Expression[]{cat.id});
|
||||
assertEquals(6l, results.getTotal());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void Unique_Result(){
|
||||
query().from(cat).limit(1).uniqueResult(cat.id);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void Unique_Result_Multiple(){
|
||||
query().from(cat).limit(1).uniqueResult(new Expression[]{cat.id});
|
||||
}
|
||||
|
||||
@Test
|
||||
public void Single_Result(){
|
||||
query().from(cat).singleResult(cat.id);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void Single_Result_Multiple(){
|
||||
query().from(cat).singleResult(new Expression[]{cat.id});
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
@ -35,6 +35,8 @@ import com.mysema.testutil.JPATestRunner;
|
||||
@JPAConfig("derby")
|
||||
public class JPADerbySQLTest {
|
||||
|
||||
private SAnimal cat = new SAnimal("cat");
|
||||
|
||||
private static final SQLTemplates derbyTemplates = new DerbyTemplates();
|
||||
|
||||
private EntityManager entityManager;
|
||||
@ -59,47 +61,67 @@ public class JPADerbySQLTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void ScalarQueries(){
|
||||
SAnimal cat = new SAnimal("cat");
|
||||
|
||||
// count
|
||||
public void Count(){
|
||||
assertEquals(6l, query().from(cat).where(cat.dtype.eq("C")).count());
|
||||
|
||||
// countDistinct
|
||||
}
|
||||
|
||||
@Test
|
||||
public void CountDistinct(){
|
||||
assertEquals(6l, query().from(cat).where(cat.dtype.eq("C")).countDistinct());
|
||||
|
||||
// list
|
||||
}
|
||||
|
||||
@Test
|
||||
public void List(){
|
||||
assertEquals(6, query().from(cat).where(cat.dtype.eq("C")).list(cat.id).size());
|
||||
|
||||
// list with limit
|
||||
}
|
||||
|
||||
@Test
|
||||
public void List_With_Limit(){
|
||||
assertEquals(3, query().from(cat).limit(3).list(cat.id).size());
|
||||
|
||||
// list with offset
|
||||
assertEquals(3, query().from(cat).offset(3).list(cat.id).size());
|
||||
|
||||
// list with limit and offset
|
||||
assertEquals(3, query().from(cat).offset(3).limit(3).list(cat.id).size());
|
||||
|
||||
// list multiple
|
||||
print(query().from(cat).where(cat.dtype.eq("C")).list(cat.id, cat.name, cat.bodyweight));
|
||||
|
||||
// listResults
|
||||
SearchResults<String> results = query().from(cat).limit(3).orderBy(cat.name.asc()).listResults(cat.name);
|
||||
assertEquals(Arrays.asList("Beck","Bobby","Harold"), results.getResults());
|
||||
assertEquals(6l, results.getTotal());
|
||||
|
||||
// unique Result
|
||||
query().from(cat).limit(1).uniqueResult(cat.id);
|
||||
|
||||
query().from(cat).limit(1).uniqueResult(new Expression[]{cat.id});
|
||||
|
||||
// single Result
|
||||
query().from(cat).singleResult(cat.id);
|
||||
|
||||
query().from(cat).singleResult(new Expression[]{cat.id});
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void List_With_Offset(){
|
||||
assertEquals(3, query().from(cat).offset(3).list(cat.id).size());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void List_Limit_And_Offset(){
|
||||
assertEquals(3, query().from(cat).offset(3).limit(3).list(cat.id).size());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void List_Multiple(){
|
||||
print(query().from(cat).where(cat.dtype.eq("C")).list(cat.id, cat.name, cat.bodyweight));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void List_Results(){
|
||||
SearchResults<String> results = query().from(cat).limit(3).orderBy(cat.name.asc()).listResults(cat.name);
|
||||
assertEquals(Arrays.asList("Beck","Bobby","Harold"), results.getResults());
|
||||
assertEquals(6l, results.getTotal());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void Unique_Result(){
|
||||
query().from(cat).limit(1).uniqueResult(cat.id);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void Unique_Result_Multiple(){
|
||||
query().from(cat).limit(1).uniqueResult(new Expression[]{cat.id});
|
||||
}
|
||||
|
||||
@Test
|
||||
public void Single_Result(){
|
||||
query().from(cat).singleResult(cat.id);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void Single_Result_Multiple(){
|
||||
query().from(cat).singleResult(new Expression[]{cat.id});
|
||||
}
|
||||
|
||||
@Test
|
||||
public void EntityQueries(){
|
||||
SAnimal cat = new SAnimal("cat");
|
||||
|
||||
Loading…
Reference in New Issue
Block a user