10-noviembre-2017
admin

Carga de una imagen para previsualizarla

Ejemplo de como podriamos cargar en una página HTML una imagen obtenida desde el disco y hacer una previsualización de ella usando javascript.

En la pagina podemos añadir un objeto de formulario de tipo file, así como una imagen donde cargaremos la que seleccionemos:

   < input type="file" id="files" name="files[]" 
                       class="btn btn-default btn-file" / >
   < img src="" id="imgPrevisualizacion" class="img-rounded" 
                       height="50" width="50" / >

Ahora sobre ese objeto programamos con javscript el evento change. De tal forma que cada vez que se seleccione una imagen se lance al detectar ese cambio.

function archivo(evt) {
      var files = evt.target.files; //obtenemos la lista de archivos

      for (var i = 0, f; f = files[i]; i++) {         
           if (!f.type.match('image.*')) { //comprobamos de que es una imagen
                continue;
           }
       
           var reader = new FileReader();
           reader.onload = (function(theFile) {
               return function(e) {
            	   //asignamos la imagen seleccionada
            	   document.getElementById("imgPrevisualizacion").src 
                                                           = e.target.result;
               };
           })(f);
            reader.readAsDataURL(f);
       }
}
//creamos el evento
document.getElementById('files').addEventListener('change', archivo, false);
1-noviembre-2017
admin

Exportar código HTML a imagen con html2canvas

Gracias a la librería html2Canvas se pueden exportar el código html como si fuera una imagen.

Dado este código html:

< div id="convierteImagen">
   < b>Hola Mundo< /b>
< /div>

Voy a poner dos ejemplos de uso.

Ejemplo 1 – Si simplemente queremos que en la propia página se cargue una imagen igual al trozo html con html2Canvas sería tan fácil como:
1.1 – Ponemos un botón que será el encargado de lanzar la función JavaScript que realice la tarea.


1.2 – Cómo se puede ver en la función a html2Canvas basta con indicarle el objeto que se quiere capturar.

function renderImg(type) {
	html2canvas(document.getElementById(type), {
		onrendered : function(canvas) {
			document.body.appendChild(canvas);
		},
		width : 470
	});
}

Ejemplo 2 – Vamos a suponer que queremos que se descarge el codigo html anterior como si fuera una imagen al hacer click en un boton. Para ello:
2.1 – Creamos un botón y en su evento onclick invocamos a la función que crea la imagen y la lanza para descargar. Además, ponemos una etiqueta < a > cuyo id será downloadLink (no se vera en la página pero la usaremos para lanzar la imagen).



2.2 – Creamos la función JavaScript que utiliza html2Canvas para crear la imagen.

function downImg(type) {
	html2canvas(document.getElementById(type), {
		onrendered : function(canvas) {
		   var dato = canvas.toDataURL("image/png");
		   var anchor = document.getElementById("downloadLink");
                   //asignamos un nombre al link
		   anchor.setAttribute('download', 'NombreParaImagen.png');
                   //asignamos la imagen
		   anchor.setAttribute('href', dato);
		   anchor.click(); //forzamos el click
		},
		width : 470
	});
}

Ejemplos

19-octubre-2017
admin

Añadir texto a archivos STL para impresión 3D con Freecad

En páginas como por ejemplo Thingiverse hay numerosos archivos *.STL (Standard Triangle Language) que podemos descargar para imprimir en nuestras impresoras 3D. A continuación, voy a explicar como podríamos realizarles alguna modificación como puede ser añadirle un texto utilizando la herramienta Freecad.

En primer lugar hay que abrir el archivo stl con el freecad. Para ello con el freecad abiero vamos a File – Open y nos ponemos en el banco Part.
Ahora debemos pasar la pieza a solido para poder modificarla, así que con la pieza seleccionada vamos ejecutando por orden las siguientes acciones:
1 – Part – Create shape form mesh… (Nos pedira marcar una tolerancia, yo suelo poner siempre 0,1)
2 – Part – Convert to solid
3 – Part – Refine shape

Tras realizar esto, podremos comprobar como ahora ya se visualizan las caras, aristas y vertices de la figura. Por lo tanto, ya podremos trabajar sobre la figura.

Si quisieramos añadir un grabado de texto, una forma rápida podría ser seguir estos pasos:
1 – Pasamos al banco Draft
2 – Seleccionamos la acción ShapeString. Nos irá pidiendo una seríe de pasos a seguir:
2.1 – Seleccionar el punto donde comenzar a escribir.
2.2 – Introducir la cadena de texto que queremos grabar.
2.3 – Introducir la altura de la letra para ese texto.
2.4 – Introducir la separación entre las letras.
2.5 – Seleccionar el tipo de letra a utilizar. Puedes buscar una fuente que te guste por internet y descargarte el archivo *.ttf de ella. Para una prueba rápida puedes coger alguna que ya tenga el propio freecad en su instalación, yo suelo seleccionar para las pruebas: FreeCAD 0.16\bin\Lib\site-packages\matplotlib\mpl-data\fonts\ttf\Vera.ttf
3 – Vamos al banco Part y extruimos el texto sobre el eje en el que estemos trabajando.

Ahora ya tendriamos la figura y el texto listos para unirlos. Una forma de unirlos puede ser ir moviendo el texto a mano hasta que quede en la posición que queremos. Pero podriamos hacerlo de forma más elegante. Para ello:
1 – Seleccionamos simultáneamente primero la pieza y después el texto para realizar la accion Edit – Alignment…
2 – Nos saldrá la pantalla dividida en dos. Seleccionas varios puntos en la figura de la izquierda (que será el texto) y seleccionas otros tantos puntos en la figura de la derecha (que sera la pieza). Los puntos tienes que marcarlos en el mismo orden en ambas figuras y son para orientar a freecad donde colocar el texto.
3 – Por ultimo en la pantalla de la pieza hariamos click en el botón derecho del ratón y seleccionamos la opción align para que realice la operación.

18-octubre-2017
admin

Planificar el cambio de filamento durante la impresión 3D con la aplicación Cura.

La aplicación Cura nos permite planificar entre otras cosas cambio de filamento durante la impresión de una pieza en 3D. Esto puede ser muy útil cuando por ejemplo sabemos que se va a terminar el filamento o bien cuando queremos que la pieza quede impresa en varios colores.

Para ello en Cura hay que ir al menú extensiones – postprocesamiento – modificar GCode.

Planificar el cambio de filamento durante la impresión 3D con la aplicación Cura.

Esto nos va a abrir una pantalla desde la cuál podremos añadir de forma bastante amigable comandos para que se ejecuten. En la figura de debajo hemos seleccionado la opcion Pause at height. A la derecha vemos que nos salen unas casillas para rellenar:
– Pause height: la altura a la que queremos que haga la pausa (depende del punto donde queramos cambiar el filamento).
– Park print head x: posicion X a la que queremos que vaya el extrusor cuando hace la pausa (lo más cómodo es llevar el extrusor al x=0).
– Park print head y: posicion Y a la que queremos que vaya el extrusor cuando hace la pausa (lo más cómodo es llevar el extrusor al y=0).
– Retraction: cuantos milímetros queremos que se retraiga el filamento para extraerlo (por ejemplo, 50 mm).
– Extrude amount: cuantos milímetros queremos que expulse el extrusor (interesamente para que limpie el color anterior de la boquilla, 100 mm está bien).
– Redo layers: numero de capas intermedias que quieres q añada para facilitar la adhesión (en mi caso suelo poner 1 o ninguna).

Planificar el cambio de filamento durante la impresión 3D con la aplicación Cura.

Nota: Probado que funciona correctamente en una Anet 8 con el firmware Skynet 2.3.1.

11-octubre-2017
admin

Impresión 3D: Añadir cambio de filamento y Restaurar firmware original.

En este videotutorial nos enseñan a realizar un cambio de filamento usando para ellos las extensiones (plugins) del programa Cura. Se puede hacer que la impresión se detenga a determinada altura y nos permita cambiar el filamento.

Y en este otro nos muestran como instalar el firmware de la Anet 8 para volver a su versión original.

6-octubre-2017
admin

Impresión 3D: Anet 8. Cabina.

Guia para meter tu anet 8 en una cabina hecha por ti mismo con 2 mesas lack de ikea.

Se coloca una mesa encima de otra, por la altura de la Anet 8 hay que añadir unos prolongadores de mesa de unos 10 cm. Hay que cerrar los laterales, en mi caso he usado unas tablas de contrachapado de 5mm de grosor y metacrilato de 3mm para los laterales (Atornillando el metacrilato al contrachapado). Para la puerta he utilizado metacrilato de 5 mm de grosor.

Sobre la mesa de abajo irá atornillada la base de la impresora, que en mi caso era una tabla de aglomerado de 1cm de grosor. Mientras, que sobre la mesa de arriba he colocado el soporte para la bobina del filamento, el soporte para el lcd y las cajas con los diferentes interruptores.

En la mesa de abajo se puede colocar una balda util para tener almacenados los filamentos.

Montando cabina para anet 8 Montando cabina para anet 8 Montando cabina para anet 8 Montando cabina para anet 8 Montando cabina para anet 8 Montando cabina para anet 8 Montando cabina para anet 8 Montando cabina para anet 8 Montando cabina para anet 8

Piezas para imprimir:
+ Prolongadores para la mesa: 1814763
+ Soporte para el LCD: 2005640
+ Guia para el filamento: 2137546
+ Guia para pasar los cables: 1740538 (wires.stl)
+ Soportes para balda inferior: 1639945
+ Manilla para la puerta: 12695
+ Filtro para salida de aire: 2105113
+ Caja para interruptor de fuente. 49542
+ Caja para interruptor de palanca. 1238650 (Utilizados para encender y apagar el ventilador añadido a la fuente y/o el de la placa)
+ Caja para interruptor de botón. 746157 (Utilizados para encender y apagar las luces led y/o el filtro del aire)

Piezas para comprar:
+ Cables
+ Leds para luz. 5 metros 300 unids SMD3528 DC 12 V de color blanco Aliexpress 2,15€
+ Filtro de carbono. pack de 10 de 12,8×18,8cm. Aliexpress 3,6€
+ Filtro HEPA. Pack de 5 de 64X45X12mm. Aliexpress 4,04€
+ Interruptores palanca. Pack de 5 de 3 pines. Aliexpress 1,22€
+ Interruptores de botón. Pack de 5 de 2 pines. Aliexpress 1,12€
+ Ventilador para el filtro del aire.

2-octubre-2017
admin

Impresión 3D: Anet 8. Montaje inicial y mejoras.

La Anet 8 se trata de una impresora bastante económica que da bastante buenos resultados. Permite imprimir tanto en PLA como ABS. Si bien, tal y como viene de fábrica, ya se puede imprimir con ella es necesario realizarle una serie de mejoras para ir obteniendo mejores resultados. Hay una gran comunidad en internet detrás de ella por lo que es muy fácil solucionar posibles problemas que puedan surgir.

A continuación se explica su funcionamiento y mejoras que se le pueden añadir para mejorar los resultados:

Montaje inicial
Por mi parte, realice el montaje de la impresora tal cual me venia de fábrica para ver que todo funcionaba correctamente. Y luego con ella imprimí las piezas necesarias para ir realizandole mejoras. Más adelante mostraré un listado con aquellas mejoras que finalmente he dejado puestas.

Anet 8 - Montaje inicial Anet 8 - Montaje inicial Anet 8 - Montaje inicial Anet 8 - Montaje inicial Anet 8 - Montaje inicial Anet 8 - Montaje inicial Anet 8 - Montaje inicial Anet 8 - Montaje inicial

Para realizar el montaje completo hay numerosos videos por la red donde se muestra como realizarlo correctamente paso por paso. Un ejemplo sería Guia montaje Anet 8, recomiendo verlos enteros una primera vez antes de realizar el montaje.

Mejora 1: Anclajes para las correas
Te permite anclar tanto la correa del eje X como del Y de manera más cómoda. Son más fáciles de maniputar al no ser necesario el uso de las bridas.
Piezas para imprimir:
+ Eje X: 1666094
+ Eje Y: 1997647

Mejora 2: Añadir interruptor a la fuente y un ventilador auxiliar
El interruptor te permite encender y apagar la impresora y el ventilador ayudará a la refrigeración de la fuente.
Piezas para imprimir:
+ Interruptor: 1798604
+ Ventilador fuente: 1683098
Piezas para comprar:
+ Un interruptor de 3 pines 15A 250V. Ebay 1,43€
+ Un fusible para el interruptor (en mi caso no traia y tuve que comprarlo aparte). Pack de 10 fusibles de 10A de 5x25mm Aliexpress 3,32€
+ Un ventilador. Pack de 5 ventiladores de 12V de 2 pines y de 5 cm Aliexpress 3,04€

Mejora 3: Refuerzos para la estructura
Permite mejorar la estabilidad de la impresora para evitar vibraciones y hacerla menos endeble.
Piezas para imprimir:
+ Soportes para reducir el movimiento del eje X: 1872162 (
Anet_A8_Top_Left_Bracket_Leo.stl y Anet_A8_Top_Right_Bracket_Leo.stl)
+ Marco para el motor Y 1831038
+ Marco para la parte delantera de la base 1430727 (frame_brace_2.stl)
+ Sujecciones de la base 1771932 (Fix_M8_R1_no_screw.STL, hacen falta 6 y dos tornillos para cada uno. Permite fijar la impresora a una base. En mi caso una tabla de 50x50cm de aglomerado de 1,5 cm de grosor.)

Mejora 4: Tensores para las correas X e Y
Con el uso las correas tenderan a aflojarse. Estos tensores permiten mantener las correas tensas de manera más fácil, simplemente girando un tornillo.
Piezas para imprimir:
+ Tensor X: 1492411 (x_idler_tension.stl se necesita un tornillo con su tuerca)
+ Tensor Y: 1908554 (se necesitan tornillos y tuercas para unir las piezas de este tensor)

Mejora 5: Estabilizar varillas eje Z
Esta mejora es necesaria para eliminar el llamado «wobble».
Piezas para imprimir:
+ Anti-wobble parte superior varilla: 1858435
+ Anti-wobble parte inferior varilla: 1539675 (z_wobble.stl)
Piezas para comprar:
+ Rodamientos 608ZZ. Pack de 10 rodamientos 608ZZ Aliexpress 2,60€

Mejora 6: Anclaje cama caliente
Para hacer más cómodo el regulado de la cama con los tornillos de ésta es interesante añadirles estas tuercas. Además se recomienda rectificar los agujeros de la H para eliminar la rosca y que sean las palometas las que suban o bajen la cama (Ver video).
Piezas para imprimir:
+ Arandelas: 1261806
+ Tuercas: 2000216

Mejora 7: Mosfet y ventilador para refrigerar electrónica
Con el mosfet evitamos que la corriente destinada a alimentar la cama pase por la placa.
Piezas para imprimir:
+ Soporte para placa: 2000271 (placa+mosfet+raspberry.stl y tapa_pi_90_80_70_60_50.stl)
Piezas para comprar:
+ Mossfet. Aliexpress 8,07€
+ Ventilador para poner sobre la placa. Ver mejora 2.

Mejora 8: Ventilador de capa
Útil para enfriar el filamento rápidamente todo alrededor.
– Pieza: 1620630

Mejora 9: Aislante térmico para extrusor y cama caliente
Muy útil para conseguir una calentamiento más rapido y tener menos consumo eléctrico. En el caso de la cama permite evitar el «warping».
Para la cama caliente, se necesita.
+ Una lámina de corcho para colocar en la parte inferior de la cama.
+ Cinta kapton para pegar el corcho a la cama.
+ Además, vamos a añadir en la parte superior de cama un cristal corriente o de borosilicato. Se puede sujetar a la cama con unas pinzas. A la hora de imprimir si usamos laca para sujetar las piezas al cristal quedarán fuertemente pegadas, evitando que se estropee la impresion. Para despegar, basta con esperar a que se enfríe la base. El cristal se puede limpiar con agua despues de realizar varias impresiones. (Yo utilizo laca Nelly normal).
Nota: En este video se muestra como podemos aislar la cama caliente.
Para el extrusor, se necesita:
+ Cinta kapton
+ Lana de roca
Nota: explicación de como se haría.
Piezas para comprar:
+ Lámina de corcho. Pack 4 láminas de 42x32cm Ikea 4,99€
+ Cristal de borosilicato. Aliexpress 7,04€
+ Pinzas de sujección
+ Laca nelly
+ Cinta kapton. Aliexpress 1,69€
+ Lana de roca. Pack de 10 tacos de 50x50x50mm Ebay 4,20€

Mejora 10 A: Final de carrera Z
Necesario para facilitar el calibrado del eje Z en el caso de poner un sensor de autonivelado (mejora 10 B).
Piezas para imprimir:
+ Final de carrera: 1776429 (se necesitan tornillos y tuercas)

Mejora 10 B: Sensor capacitivo para autonivelado
Este sensor permite que la impresora realice el calibrado del eje Z de forma automática.
Piezas para imprimir:
+ Soporte: 1907394 (Para el LJC18A3-H-Z/BX seria el modelo Sensor_Bracket_18mm_Leo.stl)
Piezas para comprar:
+ Sensor capacitivo LJC18A3-H-Z/BX. Aliexpress 5,35€

Para poder realizar su configuración recomiendo ver este video y visitar esta web.

Mejora 11: Guia y filtro para el filamento
Permite evitar que el filamento se enrede y que llegue sin motas de polvo al extrusor.
Piezas para imprimir:
+ Guia para el filamento: 1764285
+ Soporte para la bobina de filamento: 1624641 (Añadi las piezas SpoolHolder51_FDPlast_BOLT.stl y SpoolHolder51.5_FDPlast_NUT.stl al soporte que ya trae la impresora)
+ Filtro para el filamento: 1099978
Piezas para comprar:
+ Tubo de teflon para para el filamento desde el filtro al extrusor. Aliexpress 1€

Otras mejoras
– Utilizar conectores faston para toda la electrónica
– Problema con el conector de la cama caliente. Video

30-agosto-2017
admin

Instalar ROM (Lineage OS) en Samsung Galaxy 3 mini con TWRP

Lineage OS consiste en un sistema operativo de código abierto para teléfonos y tabletas Android. A continuación se explicaran los pasos a seguir para instalarlo en un Samsung Galaxy 3 mini con el TWRP.

1 – Copiar a la tarjeta externa del movil los 3 archivos siguientes.
– ROM del lineage OS, por ejemplo: lineage-14.1-20170108-UNOFFICIAL-golden.zip
– Las aplicaciones gapps: open_gapps-arm-7.1-micro-20170210.zip
– App solución de problemas de teclado: AOSP Keyboard Swype.zip

2 – Se debe tener instalado ya en el móvil el TWRP.

3 – Apagamos el movil y lo encendemos en modo recovery (para se pulsan simultáneamente las teclas volumen arriba, home, on/off realizará 3 reinicios hasta que por fin arranque el TWRP)


4 – Comprobar en la sección install que estan los tres archivos

5 – Vamos a WIPE >> ADVANCED WIPE >> seleccionamos las primeras 5 opciones >> deslizamos la barra de abajo para que limpie el equipo. Importante no seleccionar la sexta opción para la tarjeta externa.

6 – Volvemos de nuevo a la sección de install, seleccionamos la rom y luego deslizamos la barra de abajo.

7 – Cuando termine (tarda varios minutos) damos con el botón de atrás y hacemos lo mismo con las gapps.

8 – Repetimos lo mismo con AOPS Keyboard para solucionar los problemas del teclado.

9 – Ya podemos reiniciar el equipo en Reboot System. El móvil tardará un rato en iniciarse pero si todo ha ido bien debería arrancar el nuevo sistema.

Documentación de Lineage Os

23-agosto-2017
admin

Instalar Team Win Recovery Project (TWRP) en Samsung Galaxy S3 mini

El Win Recovery Project se trata de un software para Android que permite sustituir el recovery de fábrica por el suyo modificado y muchísimo más completo. Permite la instalación ROMs personalizadas entre otras funcionalidades.

Para instalarlo en un Samsung Galaxy 3 mini podemos seguir los siguientes pasos:

1 – Instalar drivers de samsung en nuestro pc. Podemos descargarlo de SAMSUNG_USB_Driver_for_Mobile_Phones.

2 – Descomprimir el programa Odin v3.07

3 – Una vez descomprimido lo ejecutamos como administrador. Odin3 v3.07.exe

4 – Dejamos únicamente seleccionada la opcion F. Reset Time.

5 – Seleccionamos con el botón PDA el archivo GT-I8190_TWRP_3.0.2-1.tar.md5

6 – Una vez preparada la parte del PC procedemos a apagar el telefono. Y lo encendemos en modo downloading ( para ello se deben pulsar simultáneamente las tablas volumen abajo, home, on/off).

7 – Cuando arranque pulsamos la tecla de volumen arriba para ir a la pantalla de downloading y conectamos el movil al pc.

8 – Esperar hasta que lo reconozca en Odin. Cuando eso pase en el log de odin saldrá Added! y ya podremos darle a Sart.

9 – Una vez finalizado el proceso del paso 8 desconectamos y apagamos el movil. (Para apagarlo basta con mantener presionado el boton de on/off varios segundos)

10 – Ahora para arrancar el TWRP sólo tenemos que iniciar el movil en modo recovery (mantener pulsadas las teclas volumen arriba, home, inicio)

Documentación Oficial TWRP

17-agosto-2017
admin

Agrupaciones en consultas con javax.persistence.criteria.CriteriaBuilder

Vamos a poner un par de ejemplos de uso del CriteriaBuilder en JPA para poder hacer consultas usando JpaSpecificationExecutor e incluso usar agrupaciones con groupBy.

Se van a ir poniendo las diferentes clases desde el Entity hasta el Service:

Entity de la tabla cuenta con un par de campos.

@Entity(name="cuentaEntity")
@Table(name="CUENTA")
public class CuentaEntity implements Serializable {
     @Id
     private Integer id;
     @Column(name="balance")
     private Integer balance;
     @Column(name="empresa")
     private String empresa;
     @Column(name="fecha")
     @Temporal(TemporalType.TIMESTAMP)
     private Date fecha;

     //getter setter
}

Su correspondiente JPAMetalModelEntityProcessor, la vamos a utilizar para las consultas.

@Generated(value = "org.hibernate.jpamodelgen.JPAMetalModelEntityProcessor")
@StaticMetamodel(CuentaEntity.class)
public abstract class CuentaEntity_ {
	public static volatile SingularAttribute< CuentaEntity, Integer> id;
	public static volatile SingularAttribute< CuentaEntity, Integer> balance;
	public static volatile SingularAttribute< CuentaEntity, String> empresa;
	public static volatile SingularAttribute< CuentaEntity, Date> fecha;
}

Un clase repositorio. Hay que hacer que herede tanto de la JpaRepository como del JpaSpecificationExecutor.

@Repository
public interface CuentaRepository extends JpaRepository< CuentaEntity, Integer>, 
                                         JpaSpecificationExecutor< CuentaEntity> {
	
}

Creamos nuestra clase criteria donde meteremos las especificaciones de las querys. Se añaden unos ejemplos de condicionales

public class CuentaCriteria implements Serializable{
     private Integer id;
     private Integer balance;
     private String empresa;
     private Date fecha;

     ......

     public static Specification< CuentaEntity> search(final CuentaCriteria cri){
	return new Specification< CuentaEntity>(){

	        @Override
		public Predicate toPredicate(Root< CuentaEntity> root, 
                                 CriteriaQuery< ?> criQuery, CriteriaBuilder criBuilder) {
				
			List< Predicate> predicates = new ArrayList< Predicate>();

			//el nombre de la empresa sea igual al que se pasa en CuentaCriteria. Si no está vacia.
			if( !StringUtils.isEmpty( cri.getEmpresa())){
				predicates.add( criBuilder.like(root.get(CuentaEntity_.empresa), cri.getEmpresa()) );
			}

			//la fecha debe ser igual a la que se pasa en CuentaCriteria. Si no está vacia.
			if( !StringUtils.isEmpty( cri.getFecha())){
				predicates.add( criBuilder.equal(root.get(StatementEntity_.fecha),cri.getFecha()) );
			}

			//podemos añadir tambien una condicion de tipo OR ( id = 0 OR id = 1). 
			List< Predicate> predOr = new ArrayList< Predicate>();
			predOr.add( criBuilder.equal(root.get(CuentaEntity_.id), 0) );
			predOr.add( criBuilder.equal(root.get(CuentaEntity_.id), 1) );
			predicates.add( criBuilder.or(predOr.toArray(new Predicate[predOr.size()]) ) );
	
			//Si tubieramos un objeto Embeddable u otro tipo de objeto podriamos acceder 
			//a las propiedades de ese objeto
			//predicates.add( criBuilder.like(root.get("OBJETO").get("CAMPO_OBJETO"), "qqqqqq") );
				
			..............

		        //Concatenamos todos los predicados como ands
			return criBuilder.and(predicates.toArray(new Predicate[predicates.size()]));
		}
	};
     }
}

Interfaz con nuestro servicio con unos métodos de prueba.

public interface CuentaService{
	public Page< CuentaEntity> find(CuentaCriteria criteria, Pageable pageable);
	public List< Object[]> findGroupBy(CuentaCriteria criteria);
	public Long count(CuentaCriteria criteria);
        .........
}

Y su implementación:

@Component("cuentaService")
@Transactional
public class CuentaServiceImpl implements CuentaService {

	@PersistenceContext
        EntityManager em; 
		
	@Autowired
	private CuentaRepository cuentaRepository;
	
	//En este método permite realizar una consulta que devuelve el listado de todas las cuentas que
	//lo cumplen. Las condiciones de la consulta se le pasan con CuentaCriteria.search(criteria).
	//No devolverá todos los elementos al pasarle un objeto Pageable para paginación.
	public Page< CuentaEntity> find(CuentaCriteria criteria, Pageable pageable){
		return cuentaRepository.findAll( CuentaCriteria.search(criteria), pageable);
	}

	//En este método deveulve la cuenta de la consulta anterior. Las condiciones de la consulta
	//se le pasan con CuentaCriteria.search(criteria).
	public Long count(StatementCriteria criteria){
		return this.statementRepository.count( StatementCriteria.search(criteria) );
	}
	
	//El groupBy no funciona bien si se mete en StatementCriteria.search(criteria), eso es porque
	//aunque hagas un multiselect() con sólo los elementos que quieres sacar en la consulta te lo va 
	//a sobreescribir por el select().
	//Una posible solución sería hacerlo como se hace en este método.
	public List< Object[]> findGroupBy(CuentaCriteria criteria){
		CriteriaBuilder cb = em.getCriteriaBuilder();
		CriteriaQuery cq = cb.createQuery();
		Root root = cq.from(StatementEntity.class);
				
		//declaramos el multiselect con las columnas a devolver
		cq.multiselect(
                       //fecha mayor
                       cb.greatest( root.get(CuentaEntity_.fecha).as(java.util.Date.class) ),
                       //fecha menor
                       cb.least( root.get(CuentaEntity_.fecha).as(java.util.Date.class) ),
                       //balance mayor
                       cb.max( root.get(CuentaEntity_.balance) ),
                       //balance menor
                       cb.min( root.get(CuentaEntity_.balance) ),
                       //media del balance
                       cb.avg( root.get(CuentaEntity_.balance) ),
                       //suma del balance total
                       cb.sum( root.get(CuentaEntity_.balance).as(java.lang.Integer.class) ),
                       //suma del balance siempre que sea mayor de cero, es decir, positivo
                       cb.sum( cb.selectCase()  
				.when(cb.greaterThan(root.get(CuentaEntity_.balance), 0), 
                                           root.get(CuentaEntity_.balance)    ).otherwise(0)),
     
                       //contador con todas las filas agrupadas
                       cb.count( root.get(CuentaEntity_.id) )
		);
                //aplicamos todas la condiciones de consulta al where
		cq.where(  CuentaCriteria.search(criteria).toPredicate(root, cq, cb)  );

                //le decimos que agrupe por el nombre de las empresas
		cq.groupBy( root.get( CuentaEntity_.empresa) );
		  
		Query query = em.createQuery(cq);

                //Por último lo podemos retornar como una lista de objetos
		return (List< Object[]>)query.getResultList();
	}	
}
Páginas:«1...567891011...30»

Categorias

Linkedin