
br.com.anteros.spring.web.resource.AbstractSQLResourceRest Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of Anteros-Spring-Web Show documentation
Show all versions of Anteros-Spring-Web Show documentation
Anteros Spring Web for Java.
The newest version!
/*******************************************************************************
* Copyright 2012 Anteros Tecnologia
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*******************************************************************************/
package br.com.anteros.spring.web.resource;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import org.springframework.http.HttpStatus;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import br.com.anteros.core.log.Logger;
import br.com.anteros.core.log.LoggerProvider;
import br.com.anteros.core.utils.Assert;
import br.com.anteros.core.utils.StringUtils;
import br.com.anteros.persistence.dsl.osql.BooleanBuilder;
import br.com.anteros.persistence.dsl.osql.DynamicEntityPath;
import br.com.anteros.persistence.dsl.osql.types.OrderSpecifier;
import br.com.anteros.persistence.dsl.osql.types.path.StringPath;
import br.com.anteros.persistence.metadata.EntityCache;
import br.com.anteros.persistence.metadata.descriptor.DescriptionField;
import br.com.anteros.persistence.session.exception.SQLSessionException;
import br.com.anteros.persistence.session.query.SQLQueryException;
import br.com.anteros.persistence.session.query.filter.AnterosFilterDsl;
import br.com.anteros.persistence.session.query.filter.AnterosMultipleFieldsFilter;
import br.com.anteros.persistence.session.query.filter.AnterosSortFieldsHelper;
import br.com.anteros.persistence.session.query.filter.DefaultFilterBuilder;
import br.com.anteros.persistence.session.query.filter.Filter;
import br.com.anteros.persistence.session.repository.Page;
import br.com.anteros.persistence.session.repository.PageRequest;
import br.com.anteros.persistence.session.service.SQLService;
/**
* Classe base para uso de serviços REST de persistência usando Anteros.
*
* @author Edson Martins [email protected]
*
* @param Tipo
* @param ID
*/
@Transactional(rollbackFor = Throwable.class, propagation = Propagation.REQUIRED, readOnly = true, transactionManager = "transactionManagerSQL")
@SuppressWarnings("unchecked")
public abstract class AbstractSQLResourceRest {
protected static Logger log = LoggerProvider.getInstance().getLogger(AbstractSQLResourceRest.class.getName());
/**
* Insere ou atualiza um objeto.
*
* @param object Objeto a ser salvo
* @return Objeto salvo
* @throws Exception
*/
@RequestMapping(value = "/", method = { RequestMethod.POST, RequestMethod.PUT })
@ResponseStatus(HttpStatus.OK)
@ResponseBody
@Transactional(rollbackFor = Throwable.class, propagation = Propagation.REQUIRED, readOnly = false, transactionManager = "transactionManagerSQL")
public T save(@RequestBody T object) throws Exception {
return getService().save(object);
}
/**
* Valida um objeto.
*
* @param object Objeto a ser validado
* @return Objeto validado
* @throws Exception
*/
@RequestMapping(value = "/validate", method = { RequestMethod.POST, RequestMethod.PUT })
@ResponseStatus(HttpStatus.OK)
@ResponseBody
@Transactional(rollbackFor = Throwable.class, propagation = Propagation.REQUIRED, readOnly = false, transactionManager = "transactionManagerSQL")
public void validate(@RequestBody T object) throws Exception {
getService().validate(object);
}
/**
* Valida um objeto.
*
* @param object Objeto a ser validado
* @param groups Grupo de validação
* @return Objeto validado
* @throws Exception
*/
@RequestMapping(value = "/validateGroup", method = { RequestMethod.POST, RequestMethod.PUT })
@ResponseStatus(HttpStatus.OK)
@ResponseBody
@Transactional(rollbackFor = Throwable.class, propagation = Propagation.REQUIRED, readOnly = false, transactionManager = "transactionManagerSQL")
public void validateGroup(@RequestBody T object, Class>... groups) throws Exception {
getService().validate(object, groups);
}
/**
* Remove um objeto pelo ID.
*
* @param id Identificador do objeto
* @return Objeto removido.
* @throws Exception
*/
@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
@ResponseStatus(HttpStatus.OK)
@ResponseBody
@Transactional(rollbackFor = Throwable.class, propagation = Propagation.REQUIRED, readOnly = false, transactionManager = "transactionManagerSQL")
public T removeById(@PathVariable(value = "id") String id) throws Exception {
ID castID = (ID) id;
T result = getService().findOne(castID,null);
if (result == null) {
throw new SQLSessionException("ID " + id + " não foi encontrado.");
}
getService().remove(result);
return result;
}
/**
* Remove todos os objetos da classe.
*
* @param ids Lista dos id's a serem removidos.
* @return Verdadeiro se removeu todos.
* @throws Exception
*/
@RequestMapping(value = "/", method = RequestMethod.DELETE)
@ResponseStatus(HttpStatus.OK)
@ResponseBody
@Transactional(rollbackFor = Throwable.class, propagation = Propagation.REQUIRED, readOnly = false, transactionManager = "transactionManagerSQL")
public Boolean removeAll(@RequestParam(required = true) List ids) throws Exception {
List newIds = new ArrayList();
for (String id : ids) {
ID castID = (ID) id;
newIds.add(castID);
}
return getService().removeAll(newIds);
}
/**
* Busca um objeto pelo seu ID.
*
* @param id Identificador do objeto.
* @return Objeto encontrado.
* @throws Exception
*/
@RequestMapping(value = "/{id}", params = { "fieldsToForceLazy" }, method = RequestMethod.GET)
@ResponseStatus(HttpStatus.OK)
@ResponseBody
@Transactional(rollbackFor = Throwable.class, propagation = Propagation.REQUIRED, readOnly = true, transactionManager = "transactionManagerSQL")
public T findOne(@PathVariable(value = "id") String id, @RequestParam("fieldsToForceLazy") String fieldsToForceLazy) throws Exception {
ID castID = (ID) id;
return getService().findOne(castID,true,fieldsToForceLazy);
}
/**
* Busca um objeto pelo seu CODE.
*
* @param id Code do objeto.
* @return Objeto encontrado.
* @throws Exception
*/
@RequestMapping(value = "/code/{code}", params = { "fieldsToForceLazy" }, method = RequestMethod.GET)
@ResponseStatus(HttpStatus.OK)
@ResponseBody
@Transactional(rollbackFor = Throwable.class, propagation = Propagation.REQUIRED, readOnly = true, transactionManager = "transactionManagerSQL")
public T findCode(@PathVariable(value = "code") String code, @RequestParam("fieldsToForceLazy") String fieldsToForceLazy) throws Exception {
return getService().findByCode(code,true,fieldsToForceLazy);
}
/**
* Busca os objetos da classe com paginação.
*
* @param page Número da página
* @param size Tamanho da página
* @return Página
*/
@RequestMapping(method = RequestMethod.GET, value = "/findAll", params = { "page", "size", "fieldsToForceLazy" })
@ResponseStatus(HttpStatus.OK)
@ResponseBody
@Transactional(rollbackFor = Throwable.class, propagation = Propagation.REQUIRED, readOnly = true, transactionManager = "transactionManagerSQL")
public Page findAll(@RequestParam("page") int page, @RequestParam("size") int size, @RequestParam("fieldsToForceLazy") String fieldsToForceLazy) {
PageRequest pageRequest = new PageRequest(page, size);
BooleanBuilder builder = new BooleanBuilder();
this.addInstanceOfExpression(builder, getEntityPath());
Page result = getService().findAll(builder, pageRequest, true, fieldsToForceLazy);
Page concretePage = this.createConcretePage(result.getContent(), pageRequest, result.getTotalElements());
if (concretePage!=null) {
return concretePage;
}
return result;
}
/**
* Busca os objetos da classe com paginação e com filtro por relacionamento
*
* @param page Número da página
* @param size Tamanho da página
* @return Página
*/
@RequestMapping(method = RequestMethod.GET, value = "/findAllByRelationShip/{field}/{id}", params = { "page", "size", "fieldsToForceLazy" })
@ResponseStatus(HttpStatus.OK)
@ResponseBody
@Transactional(rollbackFor = Throwable.class, propagation = Propagation.REQUIRED, readOnly = true, transactionManager = "transactionManagerSQL")
public Page findAll(@PathVariable("field") String field, @PathVariable("id") String id, @RequestParam("page") int page, @RequestParam("size") int size, @RequestParam("fieldsToForceLazy") String fieldsToForceLazy) {
PageRequest pageRequest = new PageRequest(page, size);
BooleanBuilder builder = new BooleanBuilder();
this.addInstanceOfExpression(builder, this.getEntityPath());
this.addRelationShipExpression(field, id, builder, this.getEntityPath());
Page result = getService().findAll(builder, pageRequest, true, fieldsToForceLazy);
Page concretePage = this.createConcretePage(result.getContent(), pageRequest, result.getTotalElements());
if (concretePage!=null) {
return concretePage;
}
return result;
}
protected void addRelationShipExpression(String field, String id, BooleanBuilder builder,
DynamicEntityPath entityPath) {
EntityCache[] entityCaches = getService().getSession().getEntityCacheManager()
.getEntitiesBySuperClassIncluding(this.getService().getResultClass());
DescriptionField descriptionField = null;
for (EntityCache eCache : entityCaches) {
descriptionField = eCache.getDescriptionField(field);
if (descriptionField != null) {
break;
}
}
if (descriptionField==null) {
throw new SQLQueryException("O campo "+field+" informado como relacionamento para o filtro não foi encontrado.");
}
if (!descriptionField.isRelationShip()) {
throw new SQLQueryException("O campo "+field+" informado não é um relacionamento.");
}
StringPath fieldString = entityPath.createFieldString(field);
builder.and(fieldString.eq(id));
}
protected void addInstanceOfExpression(BooleanBuilder builder, DynamicEntityPath entityPath) {
EntityCache entityCache = getService().getSession().getEntityCacheManager().getEntityCache(this.getService().getResultClass());
if (StringUtils.isNotBlank(entityCache.getDiscriminatorValue())){
builder.and(entityPath.instanceOf(this.getService().getResultClass()));
}
}
protected DynamicEntityPath getEntityPath() {
return (DynamicEntityPath)this.getService().getEntityPath();
}
/**
* Busca os objetos da classe com paginação e ordenado
*
* @param page Número da página
* @param size Tamanho da página
* @param sort Campos para ordenação
* @return Página
*/
@RequestMapping(method = RequestMethod.GET, value = "/findAll", params = { "page", "size", "sort", "fieldsToForceLazy" })
@ResponseStatus(HttpStatus.OK)
@ResponseBody
@Transactional(rollbackFor = Throwable.class, propagation = Propagation.REQUIRED, readOnly = true, transactionManager = "transactionManagerSQL")
public Page findAll(@RequestParam("page") int page, @RequestParam("size") int size,
@RequestParam("sort") String sort, @RequestParam("fieldsToForceLazy") String fieldsToForceLazy) {
PageRequest pageRequest = new PageRequest(page, size);
BooleanBuilder builder = new BooleanBuilder();
this.addInstanceOfExpression(builder, this.getEntityPath());
Page result = getService().findAll(builder, true, pageRequest, fieldsToForceLazy, this.convertToSortExpression(sort, this.getEntityPath()));
Page concretePage = this.createConcretePage(result.getContent(), pageRequest, result.getTotalElements());
if (concretePage!=null) {
return concretePage;
}
return result;
}
@SuppressWarnings("rawtypes")
protected OrderSpecifier>[] convertToSortExpression(String sort, DynamicEntityPath entityPath) {
EntityCache[] entityCaches = getService().getSession().getEntityCacheManager().getEntitiesBySuperClassIncluding(this.getService().getResultClass());
List orderBy = AnterosSortFieldsHelper.convertFieldsToOrderby(getService().getSession(),
entityPath, entityCaches, sort);
return orderBy.toArray(new OrderSpecifier[] {});
}
/**
* Busca os objetos da classe com paginação, ordenado e com filtro por relacionamento
*
* @param page Número da página
* @param size Tamanho da página
* @param sort Campos para ordenação
* @return Página
*/
@RequestMapping(method = RequestMethod.GET, value = "/findAllByRelationShip/{field}/{id}", params = { "page", "size", "sort", "fieldsToForceLazy" })
@ResponseStatus(HttpStatus.OK)
@ResponseBody
@Transactional(rollbackFor = Throwable.class, propagation = Propagation.REQUIRED, readOnly = true, transactionManager = "transactionManagerSQL")
public Page findAllByRelationShip(@PathVariable("field") String field, @PathVariable("id") String id, @RequestParam("page") int page, @RequestParam("size") int size,
@RequestParam("sort") String sort, @RequestParam("fieldsToForceLazy") String fieldsToForceLazy) {
PageRequest pageRequest = new PageRequest(page, size);
BooleanBuilder builder = new BooleanBuilder();
this.addInstanceOfExpression(builder, this.getEntityPath());
this.addRelationShipExpression(field, id, builder, this.getEntityPath());
Page result = getService().findAll(builder, true, pageRequest, fieldsToForceLazy, this.convertToSortExpression(sort, getEntityPath()));
Page concretePage = this.createConcretePage(result.getContent(), pageRequest, result.getTotalElements());
if (concretePage!=null) {
return concretePage;
}
return result;
}
protected Page createConcretePage(List content, PageRequest pageRequest, long totalElements){
return null;
}
/**
* Busca os objetos da classe contido na lista de ID's.
*
* @param ids Lista de ID's
* @return Lista de objetos encontrados.
*/
@RequestMapping(method = RequestMethod.GET, value = "/findAll", params = { "fieldsToForceLazy" })
@ResponseStatus(HttpStatus.OK)
@ResponseBody
@Transactional(rollbackFor = Throwable.class, propagation = Propagation.REQUIRED, readOnly = true, transactionManager = "transactionManagerSQL")
public List findAll(@RequestParam(required = true) List ids, @RequestParam("fieldsToForceLazy") String fieldsToForceLazy) {
List newIds = new ArrayList();
for (String id : ids) {
ID castID = (ID) id;
newIds.add(castID);
}
List result = getService().findAll(newIds,true, fieldsToForceLazy);
List concreteList = this.createConcreteList(result);
if (concreteList!=null) {
return concreteList;
}
return result;
}
protected List createConcreteList(List result) {
return null;
}
/**
* Busca os objetos da classe de acordo com o objeto filtro.
*
* @param filter Objeto filtro
* @param page Número da página
* @param size Tamanho da página
* @return Página
* @throws Exception
*/
@RequestMapping(value = "/findWithFilter", params = { "page", "size","fieldsToForceLazy" }, method = RequestMethod.POST)
@ResponseStatus(HttpStatus.OK)
@ResponseBody
@Transactional(rollbackFor = Throwable.class, propagation = Propagation.REQUIRED, readOnly = true, transactionManager = "transactionManagerSQL")
public Page find(@RequestBody Filter filter, @RequestParam(value = "page", required = true) int page,
@RequestParam(value = "size", required = true) int size, @RequestParam("fieldsToForceLazy") String fieldsToForceLazy) throws Exception {
PageRequest pageRequest = new PageRequest(page, size);
DefaultFilterBuilder builder = AnterosFilterDsl.getFilterBuilder();
String sort = builder.toSortSql("TBT",filter, getService().getSession(), getService().getResultClass());
String sql = builder.toSql("TBT",filter, getService().getSession(), getService().getResultClass());
EntityCache entityCache = getService().getSession().getEntityCacheManager().getEntityCache(getService().getResultClass());
DescriptionField tenantId = entityCache.getTenantId();
if (tenantId!=null) {
if (this.getService().getSession().getTenantId()==null) {
throw new SQLQueryException("Informe o Tenant ID para realizar consulta na entidade "+entityCache.getEntityClass().getName());
}
sql = sql + " AND TBT."+tenantId.getSimpleColumn().getColumnName()+"="+'"'+getService().getSession().getTenantId()+'"';
}
Page result = getService().find("select TBT.* from " + getService().getTableName() + " TBT where " + sql
+ (StringUtils.isNotEmpty(sort) ? " ORDER BY " + sort : ""), builder.getParams(), pageRequest, true, fieldsToForceLazy);
Page concretePage = this.createConcretePage(result.getContent(), pageRequest, result.getTotalElements());
if (concretePage!=null) {
return concretePage;
}
return result;
}
/**
* Busca os objetos da classe de acordo com o objeto filtro e o relacionamento
*
* @param filter Objeto filtro
* @param page Número da página
* @param size Tamanho da página
* @return Página
* @throws Exception
*/
@RequestMapping(value = "/findWithFilterByRelationShip/{field}/{id}", params = { "page", "size","fieldsToForceLazy" }, method = RequestMethod.POST)
@ResponseStatus(HttpStatus.OK)
@ResponseBody
@Transactional(rollbackFor = Throwable.class, propagation = Propagation.REQUIRED, readOnly = true, transactionManager = "transactionManagerSQL")
public Page find(@PathVariable("field") String field, @PathVariable("id") String id, @RequestBody Filter filter, @RequestParam(value = "page", required = true) int page,
@RequestParam(value = "size", required = true) int size, @RequestParam("fieldsToForceLazy") String fieldsToForceLazy) throws Exception {
PageRequest pageRequest = new PageRequest(page, size);
DefaultFilterBuilder builder = AnterosFilterDsl.getFilterBuilder();
String sort = builder.toSortSql("TBT",filter, getService().getSession(), getService().getResultClass());
String sql = builder.toSql("TBT",filter, getService().getSession(), getService().getResultClass());
EntityCache entityCache = getService().getSession().getEntityCacheManager().getEntityCache(getService().getResultClass());
DescriptionField tenantId = entityCache.getTenantId();
if (tenantId!=null) {
if (this.getService().getSession().getTenantId()==null) {
throw new SQLQueryException("Informe o Tenant ID para realizar consulta na entidade "+entityCache.getEntityClass().getName());
}
sql = sql + " AND TBT."+tenantId.getSimpleColumn().getColumnName()+"="+'"'+getService().getSession().getTenantId()+'"';
}
EntityCache[] entityCaches = getService().getSession().getEntityCacheManager().getEntitiesBySuperClassIncluding(this.getService().getResultClass());
DescriptionField descriptionField = null;
for (EntityCache eCache : entityCaches) {
descriptionField = eCache.getDescriptionField(field);
if (descriptionField != null) {
break;
}
}
if (descriptionField==null) {
throw new SQLQueryException("O campo "+field+" informado como relacionamento para o filtro não foi encontrado.");
}
if (!descriptionField.isRelationShip()) {
throw new SQLQueryException("O campo "+field+" informado não é um relacionamento.");
}
if (descriptionField.getField().getType() == String.class) {
sql = sql +" AND TBT."+descriptionField.getSimpleColumn().getColumnName() +" = '"+id+"'";
} else {
sql = sql +" AND TBT."+descriptionField.getSimpleColumn().getColumnName() +" = "+id;
}
Page result = getService().find("select TBT.* from " + getService().getTableName() + " TBT where " + sql
+ (StringUtils.isNotEmpty(sort) ? " ORDER BY " + sort : ""), builder.getParams(), pageRequest, true, fieldsToForceLazy);
Page concretePage = this.createConcretePage(result.getContent(), pageRequest, result.getTotalElements());
if (concretePage!=null) {
return concretePage;
}
return result;
}
/**
* Busca os objetos da classe de acordo com a string de filtro e os campos.
*
* @param filter String filter
* @param fields String fields
* @param page Número da página
* @param size Tamanho da página
* @return Página
* @throws Exception
*/
@RequestMapping(value = "/findMultipleFields", params = { "filter", "fields", "page", "size",
"sort","fieldsToForceLazy" }, method = RequestMethod.POST)
@ResponseStatus(HttpStatus.OK)
@ResponseBody
@Transactional(rollbackFor = Throwable.class, propagation = Propagation.REQUIRED, readOnly = true, transactionManager = "transactionManagerSQL")
public Page find(@RequestParam(value = "filter", required = true) String filter,
@RequestParam(value = "fields", required = true) String fields,
@RequestParam(value = "page", required = true) int page,
@RequestParam(value = "size", required = true) int size, @RequestParam(value = "sort") String sort,
@RequestParam("fieldsToForceLazy") String fieldsToForceLazy)
throws Exception {
PageRequest pageRequest = new PageRequest(page, size);
Page result = new AnterosMultipleFieldsFilter().filter(filter).fields(fields).session(getService().getSession()).readOnly(true)
.resultClass(getService().getResultClass()).fieldsSort(sort).page(pageRequest).fieldsToForceLazy(fieldsToForceLazy).buildAndGetPage();
Page concretePage = this.createConcretePage(result.getContent(), pageRequest, result.getTotalElements());
if (concretePage!=null) {
return concretePage;
}
return result;
}
/**
* Busca os objetos da classe de acordo com a string de filtro, campos e o relacionamento.
*
* @param filter String filter
* @param fields String fields
* @param page Número da página
* @param size Tamanho da página
* @return Página
* @throws Exception
*/
@RequestMapping(value = "/findMultipleFieldsByRelationShip/{field}/{id}", params = { "filter", "fields", "page", "size",
"sort","fieldsToForceLazy" }, method = RequestMethod.POST)
@ResponseStatus(HttpStatus.OK)
@ResponseBody
@Transactional(rollbackFor = Throwable.class, propagation = Propagation.REQUIRED, readOnly = true, transactionManager = "transactionManagerSQL")
public Page find(@PathVariable("field") String field, @PathVariable("id") String id, @RequestParam(value = "filter", required = true) String filter,
@RequestParam(value = "fields", required = true) String fields,
@RequestParam(value = "page", required = true) int page,
@RequestParam(value = "size", required = true) int size, @RequestParam(value = "sort") String sort,
@RequestParam("fieldsToForceLazy") String fieldsToForceLazy)
throws Exception {
PageRequest pageRequest = new PageRequest(page, size);
BooleanBuilder builder = new BooleanBuilder();
this.addInstanceOfExpression(builder, this.getEntityPath());
addRelationShipExpression(field, id, builder, this.getEntityPath());
Page result = new AnterosMultipleFieldsFilter(this.getEntityPath(),builder).filter(filter).fields(fields).session(getService().getSession()).readOnly(true)
.resultClass(getService().getResultClass()).fieldsSort(sort).page(pageRequest).fieldsToForceLazy(fieldsToForceLazy).buildAndGetPage();
Page concretePage = this.createConcretePage(result.getContent(), pageRequest, result.getTotalElements());
if (concretePage!=null) {
return concretePage;
}
return result;
}
/**
* Queries nomeadas
*/
/**
* Busca os objetos da classe usando uma consulta nomeada.
*
* @param queryName Nome da consulta
* @param page Número da página
* @param size Tamanho da página
* @return Página
*/
@RequestMapping(value = "/findByNamedQuery/{queryName}", params = { "page", "size", "fieldsToForceLazy" }, method = RequestMethod.GET)
@ResponseStatus(HttpStatus.OK)
@ResponseBody
@Transactional(rollbackFor = Throwable.class, propagation = Propagation.REQUIRED, readOnly = true, transactionManager = "transactionManagerSQL")
public Page findByNamedQuery(@PathVariable("queryName") String queryName,
@RequestParam(value = "page", required = true) int page,
@RequestParam(value = "size", required = true) int size, @RequestParam("fieldsToForceLazy") String fieldsToForceLazy) {
PageRequest pageRequest = new PageRequest(page, size);
Page result = getService().findByNamedQuery(queryName, pageRequest, true, fieldsToForceLazy);
Page concretePage = this.createConcretePage(result.getContent(), pageRequest, result.getTotalElements());
if (concretePage!=null) {
return concretePage;
}
return result;
}
/**
* Busca os objetos da classe usando uma consulta nomeada e um filtro.
*
* @param filter Objeto filtro
* @param queryName Nome da consulta
* @param page Número da página
* @param size Tamanho da página
* @return Página
*/
@RequestMapping(value = "/findByNamedQueryWithFilter/{queryName}", params = { "page",
"size", "fieldsToForceLazy" }, method = RequestMethod.POST)
@ResponseStatus(HttpStatus.OK)
@ResponseBody
@Transactional(rollbackFor = Throwable.class, propagation = Propagation.REQUIRED, readOnly = true, transactionManager = "transactionManagerSQL")
public Page findByNamedQuery(@RequestBody Filter filter, @PathVariable("queryName") String queryName,
@RequestParam(value = "page", required = true) int page,
@RequestParam(value = "size", required = true) int size, @RequestParam("fieldsToForceLazy") String fieldsToForceLazy) {
PageRequest pageRequest = new PageRequest(page, size);
DefaultFilterBuilder builder = AnterosFilterDsl.getFilterBuilder();
Assert.notNull(queryName, "O nome da query não pode ser nulo.");
String query;
Page result = null;
try {
String sort = builder.toSortSql("",filter, getService().getSession(), getService().getResultClass());
String sql = builder.toSql("",filter, getService().getSession(), getService().getResultClass());
query = getService().getNamedQuery(queryName).getQuery() + " WHERE " + sql
+ (StringUtils.isNotEmpty(sort) ? " ORDER BY " + sort : "") + sort;
result = getService().find(query, builder.getParams(), pageRequest, true, fieldsToForceLazy);
} catch (Exception e) {
throw new SQLSessionException("Não foi possível executar a query nomeada " + queryName, e);
}
Page concretePage = this.createConcretePage(result.getContent(), pageRequest, result.getTotalElements());
if (concretePage!=null) {
return concretePage;
}
return result;
}
/**
* Busca os objetos da classe usando uma consulta nomeada de acordo com os
* parâmetros.
*
* @param queryName Nome da consulta
* @param page Número da página
* @param size Tamanho da página
* @param parameters Lista de parâmetros
* @return Página
*/
@RequestMapping(value = "/findByNamedQueryWithParams/{queryName}", params = { "page", "size",
"parameters", "fieldsToForceLazy" }, method = RequestMethod.GET)
@ResponseStatus(HttpStatus.OK)
@ResponseBody
@Transactional(rollbackFor = Throwable.class, propagation = Propagation.REQUIRED, readOnly = true, transactionManager = "transactionManagerSQL")
public Page findByNamedQuery(@PathVariable("queryName") String queryName,
@RequestParam(value = "page", required = true) int page,
@RequestParam(value = "size", required = true) int size,
@RequestParam(value = "parameters", required = true) List parameters,
@RequestParam("fieldsToForceLazy") String fieldsToForceLazy) {
PageRequest pageRequest = new PageRequest(page, size);
Page result = getService().findByNamedQuery(queryName, parameters, pageRequest, true, fieldsToForceLazy);
Page concretePage = this.createConcretePage(result.getContent(), pageRequest, result.getTotalElements());
if (concretePage!=null) {
return concretePage;
}
return result;
}
/**
* Busca os objetos da classe usando uma consulta nomeada de acordo com os
* parâmetros e filtro.
*
* @param filter Objeto filtro
* @param queryName Nome da consulta
* @param page Número da página
* @param size Tamanho da página
* @param parameters Lista de parâmetros
* @return Página
*/
@RequestMapping(value = "/findByNamedQueryWithParamsAndFilter/{queryName}", params = { "page", "size",
"parameters","fieldsToForceLazy" }, method = RequestMethod.POST)
@ResponseStatus(HttpStatus.OK)
@ResponseBody
@Transactional(rollbackFor = Throwable.class, propagation = Propagation.REQUIRED, readOnly = true, transactionManager = "transactionManagerSQL")
public Page findByNamedQuery(@RequestBody Filter filter, @PathVariable("queryName") String queryName,
@RequestParam(value = "page", required = true) int page,
@RequestParam(value = "size", required = true) int size,
@RequestParam(value = "parameters", required = true) List parameters,
@RequestParam("fieldsToForceLazy") String fieldsToForceLazy) {
PageRequest pageRequest = new PageRequest(page, size);
Page result = getService().findByNamedQuery(queryName, parameters, pageRequest, true, fieldsToForceLazy);
Page concretePage = this.createConcretePage(result.getContent(), pageRequest, result.getTotalElements());
if (concretePage!=null) {
return concretePage;
}
return result;
}
/**
* Count
*/
/**
* Retorna a quantidade de objetos da classe.
*
* @return Número total de objetos
*/
@RequestMapping(value = "/count", method = RequestMethod.GET)
@ResponseStatus(HttpStatus.OK)
@ResponseBody
@Transactional(rollbackFor = Throwable.class, propagation = Propagation.REQUIRED, readOnly = true, transactionManager = "transactionManagerSQL")
public long count() {
return getService().count();
}
/**
* Verifica a existência de um objeto com o ID.
*
* @param id Id do objeto
* @return Verdadeiro se existir.
*/
@RequestMapping(value = "/exists/{id}", method = RequestMethod.GET)
@ResponseStatus(HttpStatus.OK)
@ResponseBody
@Transactional(rollbackFor = Throwable.class, propagation = Propagation.REQUIRED, readOnly = true, transactionManager = "transactionManagerSQL")
public boolean exists(@PathVariable String id) {
ID castID = (ID) id;
return getService().exists(castID);
}
/**
* Verifica a existência dos objetos contidos na lista.
*
* @param ids Lista de id's para verificar a existência.
* @return Verdadeiro se existir algum id.
*/
@RequestMapping(value = "/exists", method = RequestMethod.GET)
@ResponseStatus(HttpStatus.OK)
@ResponseBody
@Transactional(rollbackFor = Throwable.class, propagation = Propagation.REQUIRED, readOnly = true, transactionManager = "transactionManagerSQL")
public boolean exists(@RequestParam(required = true) List ids) {
List newIds = new ArrayList();
for (String id : ids) {
ID castID = (ID) id;
newIds.add(castID);
}
return getService().exists(newIds);
}
/**
* Método abstrato que irá fornecer a classe de serviço para ser usada no
* controller.
*
* @return
*/
public abstract SQLService getService();
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy