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