Contamos con una base de datos MongoDB con varias colecciones
public class Orden {
Document doc = new Document("usuario.0.username", "avbravo");
ordenList = ordenRepository.findPagination(doc, page, rowPage, new Document("idorden", -1));
public class Orden {
@Id
private Integer idorden;
private Date fecha;
private String tipoorden;
private String subtipoorden;
private String observacion;
private Integer idemisor;
private String tipoemisor;
@Referenced(documment = "Almacen", repository = "com.avbravo.storeejb.repository.AlmacenRepository",
field = "idalmacen", javatype = "Integer", lazy = false)
private Almacen almacen;
@Referenced(documment = "Usuario", repository = "com.avbravo.storeejb.repository.UsuarioRepository",
field = "username", javatype = "String", lazy = false)
private List<Usuario> usuario;
private String activo;
@Embedded
private List<UserInfo> userInfo;
}
}
public class Usuario {
@Id
private String username;
private String nombre;
private String password;
private String email;
private String telefono;
private Double porcentajecomision;
private String activo;
private String direccion;
@Referenced(documment = "Almacen",
repository = "com.avbravo.storeejb.repository.AlmacenRepository",
field = "idalmacen", javatype = "Integer", lazy = false)
private List<Almacen> almacen;
@Referenced(documment = "Rol", repository = "com.avbravo.storeejb.repository.RolRepository",
field = "idrol", javatype = "String", lazy = false)
private List<Rol> rol;
@Referenced(documment = "Empresa", repository = "com.avbravo.storeejb.repository.EmpresaRepository",
field = "idempresa", javatype = "Integer", lazy = false)
private Empresa empresa;
@Embedded
private List<UserInfo> userInfo;
public Usuario() {
}
}
Si realizamos una consulta encontraremos un List<Usuario> en la colecciĆ³n hemos definido previamente que el primer elemento sera para almacenar el usuario que sera el que autoriza la operaciĆ³n, las demĆ”s posiciones estan indicadas por reglas que establecemos en base al tipo y subtipoorden.
Buscar un username en una posiciĆ³n especifica
Por ejemplo deseamos buscar el username = avbravo en la posiciĆ²n 0, indicamos usuario.posicion.campo
db.orden.find( {"usuario.0.username":"avbravo"}).pretty()
Si usamos ejbmoordb,
ordenList = ordenRepository.findPagination(doc, page, rowPage, new Document("idorden", -1));
Un ejemplo con un autocomplete
Definimos que la persona que autoriza la operaciĆ³n se encuentra en la posiciĆ³n 0 del List<>, deseamos buscarla especĆficamente en esa posiciĆ³n.<p:outputLabel value="#{msg['field.autorizado']}"/><e:autocompleteusuario listener="#{ordenController.searchBy('autorizado')}"value="#{ordenController.autorizado}"itemLabel=" #{p.nombre}"field="nombre"dropdown="true"update=" :form:dataTable"fromstart="true"minQueryLength="0"size="45"
Filtra un List<> con paginaciĆ²n
Datatable
<b:panel id="dataTable">
<a:paginator
rowPage="#{ordenController.rowPage}"
clear="#{ordenController.clear()}"
first="#{ordenController.first()}"
back="#{ordenController.back()}"
next="#{ordenController.next()}"
last="#{ordenController.last()}"
page="#{ordenController.page}"
pages="#{ordenController.pages}"
skip="ajax:ordenController.skip(ordenController.page)"
renderednew="false"
new="#{ordenController.prepare('gonew',ordenController.orden)}"
printAll="#{ordenController.printAll()}"
/>
<b:dataTable value="#{ordenController.ordenDataModel}"
var="item"
id="dataTable2"
paginated="false"
onpage="console.log('page');">
<b:dataTableColumn value="#{item.idorden}" label="#{msg['field.idorden']}"/>
<b:dataTableColumn label="#{msg['field.fecha']}" >
<a:labelDate value="#{item.fecha}"/>
</b:dataTableColumn>
<b:dataTableColumn value="#{ordenController.ordenServices.convertirTipoSubtipoOrdenAMayuscula(item.tipoorden,item.subtipoorden)}" label="#{msg['field.tipoorden']}"/>
<b:dataTableColumn value="#{ordenController.ordenServices.getDescripcionOfEmisorReceptor(item.idemisor,item.tipoemisor)}" label="#{msg['field.idemisor']}"/>
<b:dataTableColumn value="#{item.almacen.descripcion}" label="#{msg['field.idreceptor']}"/>
<b:dataTableColumn value="#{ordenController.ordenServices.nombreDeAutorizado(item)}" label="#{msg['field.autorizadopor']}"/>
<b:dataTableColumn value="#{ordenController.ordenServices.nombreDeEncargadoTienda(item)}" label="#{msg['field.encargadotienda']}"/>
<b:dataTableColumn value="#{item.activo}" label="#{msg['field.activo']}"/>
<b:dataTableColumn label="">
<a:column
edit="#{ordenController.prepare('view',item)}"
delete="#{ordenController.delete(item,false)}"
rendered="#{applicationMenu.orden.delete}" />
</b:dataTableColumn>
</b:dataTable>
En el Controller
// <editor-fold defaultstate="collapsed" desc="searchBy(String string, Boolean... blns)">
@Override
public String searchBy(String string) {
try {
loginController.put("searchorden", string);
writable = true;
move();
} catch (Exception e) {
JsfUtil.errorMessage("searchBy()" + e.getLocalizedMessage());
}
return "";
}// </editor-fold>
// <editor-fold defaultstate="collapsed" desc="move">
@Override
public void move() {
try {
Document doc;
switch (loginController.get("searchorden")) {
case "_init":
ordenList = ordenRepository.findPagination(page, rowPage, new Document("idorden", -1));
break;
case "_autocomplete":
//no se realiza ninguna accion
break;
case "idorden":
doc = new Document("idorden", orden.getIdorden());
ordenList = ordenRepository.findPagination(doc, page, rowPage, new Document("idorden", -1));
break;
case "autorizado":
doc = new Document("usuario.0.username", autorizado.getUsername());
ordenList = ordenRepository.findPagination(doc, page, rowPage, new Document("idorden", -1));
break;
case "#":
doc = new Document("idorden", lookupStoreejbServices.getIdorden());
ordenList = ordenRepository.findPagination(doc, page, rowPage, new Document("idorden", -1));
break;
case "fecha":
doc = new Document("fecha", lookupStoreejbServices.getFecha());
ordenList = ordenRepository.findPagination(doc, page, rowPage, new Document("idorden", -1));
break;
case "_betweendates":
ordenList = ordenRepository.filterBetweenDatePagination("activo", "si", "fecha", lookupStoreejbServices.getFechaDesde(), "fecha", lookupStoreejbServices.getFechaHasta(), page, rowPage, new Document("idorden", -1));
break;
case "proveedor":
doc = new Document("idemisor",proveedorSelected.getIdproveedor()).append("tipoemisor", "proveedor");
ordenList = ordenRepository.findPagination(doc, page, rowPage, new Document("idorden", -1));
break;
case "emisor":
doc = new Document("idemisor",emisor.getIdalmacen()).append("tipoemisor", "almacen");
ordenList = ordenRepository.findPagination(doc, page, rowPage, new Document("idorden", -1));
break;
case "receptor":
doc = new Document("almacen.idalmacen",receptor.getIdalmacen());
ordenList = ordenRepository.findPagination(doc, page, rowPage, new Document("idorden", -1));
break;
default:
ordenList = ordenRepository.findPagination(page, rowPage);
break;
}
ordenFiltered = ordenList;
ordenDataModel = new OrdenDataModel(ordenList);
} catch (Exception e) {
JsfUtil.errorMessage("move() " + e.getLocalizedMessage());
}
}// </editor-fold>
Consultar si existe el usuario avbravo en cualquier elemento de la lista
> db.orden.find( {"usuario.username":"avbravo"}).pretty()
Se desea consultar que exista el username avbravo en la lista que tenga solo dos elementos, utilizamos:
"usuario":{$size:2}
Comments