private static String generateToken() { final StringBuilder builder = new StringBuilder(260); while (builder.length() < 256) { builder.append(Long.toHexString(TOKEN_GENERATOR.nextLong())); } return builder.substring(0, 256); }
public Query buildQuery(Integer type, T example, String... orden) { StringBuilder qry; List<String> ids = new ArrayList<String>(); if (type == 1) { qry = new StringBuilder(SELECT_COUNT); qry.append(example.getClass().getSimpleName()); } else { qry = new StringBuilder(SELECT); qry.append(example.getClass().getSimpleName()); ids = this.obtenerId(example); } qry.append(FROM); qry.append(WHERE); List<Object> parametros = new ArrayList(); Criterio criterio = new Criterio(); Map<String, Object> propiedades = this.obtenerPropiedades(example); criterio.contruccion(propiedades); Set<String> igualdad = criterio.igualdad.keySet(); Integer idx = 1; for (String key : igualdad) { if (idx > 1) { qry.append(AND); } qry.append(OBJ); qry.append(key); qry.append(EQ); qry.append(idx); parametros.add(criterio.igualdad.get(key)); idx++; } Set<String> likeKeys = criterio.like.keySet(); for (String key : likeKeys) { if (idx > 1) { qry.append(AND); } Object valor = criterio.like.get(key); if (valor instanceof String) { qry.append(LOWER); qry.append(OBJ); qry.append(key); qry.append(")"); qry.append(LIKE); qry.append(idx); parametros.add(((String) valor).toLowerCase()); } else { qry.append(OBJ); qry.append(key); qry.append(LIKE); qry.append(idx); parametros.add(valor); } idx++; } Set<String> compositeKeys = criterio.compuesto.keySet(); for (String key : compositeKeys) { Object value = criterio.compuesto.get(key); try { if (value.toString().startsWith("class java.util")) { continue; } else if (StringUtils.containsIgnoreCase(key, "pk")) { Map<String, Object> propsComposites = this.obtenerPropiedades(value, key); Criterio criterioCompuesto = new Criterio(); criterioCompuesto.contruccion(propsComposites); if (!criterioCompuesto.igualdad.isEmpty()) { Set<String> eqKeysPK = criterioCompuesto.igualdad.keySet(); for (String keyPK : eqKeysPK) { if (idx > 1) { qry.append(AND); } qry.append(OBJ); qry.append(keyPK); qry.append(EQ); qry.append(idx); parametros.add(criterioCompuesto.igualdad.get(keyPK)); idx++; } } if (!criterioCompuesto.like.isEmpty()) { Set<String> likeKeysPK = criterioCompuesto.like.keySet(); for (String keyPK : likeKeysPK) { if (idx > 1) { qry.append(AND); } Object valor = criterioCompuesto.like.get(keyPK); if (valor instanceof String) { qry.append(LOWER); qry.append(OBJ); qry.append(keyPK); qry.append(")"); qry.append(LIKE); qry.append(idx); parametros.add(((String) valor).toLowerCase()); } else { qry.append(OBJ); qry.append(keyPK); qry.append(LIKE); qry.append(idx); parametros.add(valor); } idx++; } } } else { Map<String, Object> propsComposites = this.obtenerPropiedades(value); Criterio criterioCompuesto = new Criterio(); criterioCompuesto.contruccion(propsComposites); if (!criterioCompuesto.igualdad.isEmpty()) { Set<String> eqKeysPK = criterioCompuesto.igualdad.keySet(); for (String keyPK : eqKeysPK) { if (idx > 1) { qry.append(AND); } qry.append(OBJ); qry.append(key); qry.append("."); qry.append(keyPK); qry.append(EQ); qry.append(idx); parametros.add(criterioCompuesto.igualdad.get(keyPK)); idx++; } } if (!criterioCompuesto.like.isEmpty()) { Set<String> likeKeysPK = criterioCompuesto.like.keySet(); for (String keyPK : likeKeysPK) { System.out.println( "Compuesto LIKE: " + keyPK + ", " + criterioCompuesto.igualdad.get(keyPK)); if (idx > 1) { qry.append(AND); } Object valor = criterioCompuesto.like.get(keyPK); if (valor instanceof String) { qry.append(LOWER); qry.append(OBJ); qry.append(key); qry.append("."); qry.append(keyPK); qry.append(")"); qry.append(LIKE); qry.append(idx); parametros.add(((String) valor).toLowerCase()); } else { qry.append(OBJ); qry.append(key); qry.append("."); qry.append(keyPK); qry.append(LIKE); qry.append(idx); parametros.add(valor); } idx++; } } } } catch (RuntimeException e) { continue; } } if (idx == 1) { qry.append(" 1=1"); } if (!ids.isEmpty()) { qry.append(ORDER); } else { qry.append(" "); } if (orden.length > 0) { for (String ord : orden) { qry.append(OBJ); qry.append(ord.substring(2)); if (ord.startsWith("A,")) { qry.append(ASC); } else if (ord.startsWith("D,")) { qry.append(DESC); } } } else { for (String id : ids) { if (!id.contains("_persistence")) { qry.append(OBJ); qry.append(id); qry.append(ASC); } } } System.out.println(qry.substring(0, qry.length() - 2)); Query query = this.em.createQuery(qry.substring(0, qry.length() - 2)); if (!parametros.isEmpty()) { int i = 1; for (Object obj : parametros) { query.setParameter(i, obj); i++; } } return query; }