Overview

What Is

Object Query is a simple query builder thought for java, that allow to write typesafe and refactor resistant query, without bound to persistence engine.

License

The Apache Software License, Version 2.0

Support

issue tracker:https://github.com/organizations/objectquery/dashboard/issues

mailing list:https://groups.google.com/group/objectquery

source:https://github.com/organizations/objectquery

Roadmap

1.0.0

base select statement DONE
projections with grouping functions DONE
conditions and nested conditions DONE
order by with grouping functions DONE
having clause JPA Only
ignore case like condition type DONE

1.5.0

Nested Query TODO
Join TODO

2.0.0

support for update operation TODO
support for delete operation TODO
support for insert operation TODO

Install

Maven

Insert the specify maven dependency for each implementation:

JPA:

<dependency>
	<groupId>org.objectquery</groupId>
	<artifactId>jpaobjectquery</artifactId>
	<version>1.0.0</version>
</dependency>
JDO:
<dependency>
	<groupId>org.objectquery</groupId>
	<artifactId>jdoobjectquery</artifactId>
	<version>1.0.0</version>
</dependency>
OrientDB:
<dependency>
	<groupId>org.objectquery</groupId>
	<artifactId>orientdbobjectquery</artifactId>
	<version>1.0.0</version>
</dependency>

Build A query

Requirements

The requirements for build a query with query builder is an java Object Oriented "Domain" that is an group of persisted objects.

Domain

public class Dog {
	private String name;
	private Person owner;
	private Home home;
	...gets sets...
};
public class Person {
	private String name;
	private List<Person> friends;
	private Person mum;
	private Person dud;
	private Home home;
	private Dog dog;
	...gets sets...
}
public class Home {
	public enum HomeType {KENNEL,HOUSE};
	private String address;
	private HomeType type;
	private int weight;
	private double price;
	...gets sets...
}

Simple Query Building

Search All person that live in "rue d'anton" with a mum with name "elisabeth" and order by name.

ObjectQuery<Person> query = new GenericObjectQuery<Person>(Person.class);
Person toSearch = query.target();
query.eq(toSearch.getHome().getAddress(),"rue d'anton");
query.eq(toSearch.getMum().getName(),"elisabeth");
query.order(toSearch.getName());

Projection

Select name and address of person.

ObjectQuery<Person> query = new GenericObjectQuery<Person>(Person.class);
Person toSearch = query.target();
query.prj(toSearch.getName());
query.prj(toSearch.getHome().getAddress());

Grouping Functions

Count all person that live in "rue d'anton"

ObjectQuery<Person> query = new GenericObjectQuery<Person>(Person.class);
Person toSearch = query.target();
query.prj(toSearch,ProjectionType.COUNT);
query.eq(toSearch.getHome().getAddress(),"rue d'anton");

Condition group

Search all person with name elisabeth or jhon.

ObjectQuery<Person> query = new GenericObjectQuery<Person>(Person.class);
Person toSearch = query.target();
QueryCondition or = oq.or();
or.eq(toSearch.getName(),"elisabeth");
or.eq(toSearch.getName(),"jhon");

Primitive Type

Primitive type need a different management, for some technical reasons is not possible use primitive type directly
for use it we need to box it

ObjectQuery<Person> query = new GenericObjectQuery<Person>(Person.class);
Person toSearch = query.target();
query.eq(query.box(toSearch.getWeight()),2);
query.eq(query.box(toSearch.getPrice()),4000.0);

Condition Operator

OperatorImplementation
JPAJDOOrientDb
eqokokok
notEqokokok
likeokokok
notLikeokokok
minokokok
minEqokokok
maxokokok
maxEqokokok
inokokok
notInokokok
containsokokok
notContainsokokok
orokokok
andokokok

Projection

OperatorImplementation
JPAJDOOrientDb
MAXokokok
MINokokok
AVGokokok
COUNTokokok

Order Operator

OperatorImplementation
JPAJDOOrientDb
ASCokokok
DESCokokok

Having Operator

Projection
OperatorImplementation
JPAJDOOrientDb
MAXokkoko
MINokkoko
AVGokkoko
COUNTokkoko
Condition Operator
OperatorImplementation
JPAJDOOrientDb
eqokkoko
notEqokkoko
likeokkoko
notLikeokkoko
minokkoko
minEqokkoko
maxokkoko
maxEqokkoko
inokkoko
notInokkoko
containsokkoko
notContainsokkoko
orokkoko
andokkoko

Query Engine Support

JPA

Direct execute:

javax.persistence.EntityManager entityManager= ....
ObjectQuery<Person> query = new GenericObjectQuery<Person>(Person.class);
...
List<Person> res = (List<Person>)JPAObjectQuery.execute(query, entityManager);
...
JPA query generation:
javax.persistence.EntityManager entityManager= ....
ObjectQuery<Person> query = new GenericObjectQuery<Person>(Person.class);
...
javax.persistence.Query jpaQuery = JPAObjectQuery.buildQuery(query, entityManager);
...
JPQL string and parameters generation:
ObjectQuery<Person> query = new GenericObjectQuery<Person>(Person.class);
...
JPQLQueryGenerator jpqlGenerator = JPAObjectQuery.jpqlGenerator(query);
String jpql = jpqlGenerator.getQuery();
Map<String,Object> paramenters = jpqlGenerator.getParameters();
...

JDO

Direct execute:

javax.jdo.PersistenceManager peristenceManager= ....
ObjectQuery<Person> query = new GenericObjectQuery<Person>(Person.class);
...
List<Person> res = (List<Person>)JDOObjectQuery.execute(query, peristenceManager);
...
JDOQL string and parameters generation:
ObjectQuery<Person> query = new GenericObjectQuery<Person>(Person.class);
...
JDOQLQueryGenerator jdoqlGenerator = JDOObjectQuery.jdoqlGenerator(query);
String jpql = jdoqlGenerator.getQuery();
Map<String,Object> paramenters = jdoqlGenerator.getParameters();
...

OrientDB

Direct execute:

com.orientechnologies.orient.object.db.OObjectDatabaseTx db= ....
ObjectQuery<Person> query = new GenericObjectQuery<Person>(Person.class);
...
List<Person> res = (List<Person>)OrientDBObjectQuery.execute(query, db);
...
OrientDB Query string and parameters generation:
ObjectQuery<Person> query = new GenericObjectQuery<Person>(Person.class);
...
OrientDBQueryGenerator oriendbGenerator = OrientDBObjectQuery.oriendbGenerator(query);
String orientdbql = oriendbGenerator.getQuery();
Map<String,Object> paramenters = oriendbGenerator.getParameters();
...