package org.zstack.core.db;
import org.springframework.beans.factory.annotation.Autowire;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.transaction.annotation.Transactional;
import javax.persistence.Tuple;
import javax.persistence.metamodel.SingularAttribute;
import java.util.Collection;
import java.util.List;
/**
* Created by xing5 on 2016/12/31.
*/
@Configurable(preConstruction = true, autowire = Autowire.BY_TYPE)
public class Q {
@Autowired
private DatabaseFacade dbf;
private SimpleQueryImpl q;
private Q(Class clz) {
q = new SimpleQueryImpl(clz);
}
public Q select(SingularAttribute... attrs) {
q.select(attrs);
return this;
}
public Q orderBy(SingularAttribute attr, SimpleQuery.Od order) {
q.orderBy(attr, order);
return this;
}
public Q groupBy(SingularAttribute attr) {
q.groupBy(attr);
return this;
}
public Q limit(int limit) {
q.setLimit(limit);
return this;
}
public Q start(int start) {
q.setStart(start);
return this;
}
@Transactional
public boolean isExists() {
return q._count() > 0;
}
@Transactional
public Long count() {
return q._count();
}
@Transactional
public <T> T find() {
return (T) q._find();
}
@Transactional
public <T> List<T> list() {
return q._list();
}
@Transactional
public <K> K findValue() {
return (K) q._findValue();
}
@Transactional
public <K> List<K> listValues() {
return q._listValue();
}
@Transactional
public Tuple findTuple() {
return q._findTuple();
}
@Transactional
public List<Tuple> listTuple() {
return q._listTuple();
}
public Q eq(SingularAttribute attr, Object val) {
q.add(attr, SimpleQuery.Op.EQ, val);
return this;
}
public Q notEq(SingularAttribute attr, Object val) {
q.add(attr, SimpleQuery.Op.NOT_EQ, val);
return this;
}
public Q in(SingularAttribute attr, Collection val) {
q.add(attr, SimpleQuery.Op.IN, val);
return this;
}
public Q notIn(SingularAttribute attr, Collection val) {
q.add(attr, SimpleQuery.Op.NOT_IN, val);
return this;
}
public Q isNull(SingularAttribute attr) {
q.add(attr, SimpleQuery.Op.NULL);
return this;
}
public Q notNull(SingularAttribute attr) {
q.add(attr, SimpleQuery.Op.NOT_NULL);
return this;
}
public Q gt(SingularAttribute attr, Object val) {
q.add(attr, SimpleQuery.Op.GT, val);
return this;
}
public Q gte(SingularAttribute attr, Object val) {
q.add(attr, SimpleQuery.Op.GTE, val);
return this;
}
public Q lt(SingularAttribute attr, Object val) {
q.add(attr, SimpleQuery.Op.LT, val);
return this;
}
public Q lte(SingularAttribute attr, Object val) {
q.add(attr, SimpleQuery.Op.LTE, val);
return this;
}
public Q like(SingularAttribute attr, Object val) {
q.add(attr, SimpleQuery.Op.LIKE, val);
return this;
}
public Q notLike(SingularAttribute attr, Object val) {
q.add(attr, SimpleQuery.Op.NOT_LIKE, val);
return this;
}
public static Q New(Class clz) {
return new Q(clz);
}
}