Buscar en un List<> en cualquier posicion usando and y or
A veces necesitamos hacer filtros complejos sobre un List<>

Tenemos las clases
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 hacemos una consulta a la colección, List<Usuario>.

Deseamos filtrar en List<Usuario>, el encargado de tienda si observamos para algunas condiciones del subtipoorden, este estará en la posición 2 y para otras condiciones del subtipo de orden lo encontraremos en la posición 1.

Tendremos que crear un filtro complejo en el cual para obtener el usuario.#.username puede ser 1 o 2 dependiendo de las condiciones :;
posición
subtipoorden
2
tiendaabodega
2
bodegaatienda
2
bodegaainterno
2
internoabodega
1
tiendaainterno
1
iternoatienda
En este caso lo encontramos en la posición 1 al encargado de tienda ya que subtipoorden="tiendaainterno"

En el caso que el sutipoorden=""tiendaabodega" el encargado de tienda estara en la posiciòn 2:

Creamos los filtros para que busque en la posición 2 o 1 en base al valor de subtipoorden.,
Bson filter_1 =Filters.and(Filters.eq("usuario.2.username",encargadotienda.getUsername()),
Filters.or(Filters.eq("subtipoorden","tiendaabodega"),
Filters.eq("subtipoorden","bodegaatienda"),
Filters.eq("subtipoorden","bodegaainterno"),
Filters.eq("subtipoorden","internoabodega")));
Bson filter_2 =Filters.and(Filters.eq("usuario.1.username",encargadotienda.getUsername()),
Filters.or(Filters.eq("subtipoorden","tiendaainterno"),
Filters.eq("subtipoorden","iternoatienda")));
Bson filter =Filters.or(filter_1, filter_2);
ordenList = ordenRepository.filtersPagination(filter, page, rowPage, new Document("idorden", -1));

Last updated
Was this helpful?