Duvidas com Lazy Loading

Estou fazendo uma aplicação java utilizando primefaces 5.1 e queria usar o lazy loading para filtrar a pesquisa com um parâmetro de um enum (ESPERA). Para mostrar somente os pacientes que estiverem com esse tipo de status, mas estou com duvida sobre como fazer isso. Obrigado

Meu repository

@SuppressWarnings("unchecked")
public List<ListaEspera> filtrados(ListaFilter filtro) {
	Criteria criteria = criarCriteriaParaFiltro(filtro);

	criteria.setFirstResult(filtro.getPrimeiroRegistro());
	criteria.setMaxResults(filtro.getQuantidadeRegistros());

	return criteria.addOrder(Order.asc("id")).list();
}

public int quantidadeFiltrados(ListaFilter filtro) {
	Criteria criteria = criarCriteriaParaFiltro(filtro);

	criteria.setProjection(Projections.rowCount());
	return ((Number) criteria.uniqueResult()).intValue();
}

private Criteria criarCriteriaParaFiltro(ListaFilter filtro) {

	Session session = manager.unwrap(Session.class);
	Criteria criteria = session.createCriteria(ListaEspera.class).createAlias("paciente", "p");
	;

	if (StringUtils.isNotBlank(filtro.getNome())) {
		criteria.add(Restrictions.ilike("p.nome", filtro.getNome(), MatchMode.START));
	}
	if (StringUtils.isNotBlank(filtro.getIdentificacao())) {
		criteria.add(Restrictions.ilike("p.identificacao", filtro.getIdentificacao(), MatchMode.EXACT));
	}
	if (StringUtils.isNotBlank(filtro.getTelefone())) {
		criteria.add(Restrictions.ilike("p.telefone", filtro.getTelefone(), MatchMode.EXACT));
	}
	if (StringUtils.isNotBlank(filtro.getIdade())) {
		criteria.add(Restrictions.ilike("p.idade", filtro.getIdade(), MatchMode.EXACT));
	}

	if (filtro.getSexos() != null && filtro.getSexos().length > 0) {

		criteria.add(Restrictions.in("p.sexo", filtro.getSexos()));
	}

	if (filtro.getEsperando() != null && filtro.getEsperando().length > 0) {
		criteria.add(Restrictions.in("p.status.ESPERA", filtro.getEsperando()));

	}

	return criteria;
}

}

Meu filtro

private String nome;
	private String identificacao;
	private String telefone;
	private String idade;
	private Sexo[] sexos;
	private int primeiroRegistro;
	private int quantidadeRegistros;
	private StatusAgendamento[] esperando;

//gets e sets .....

Meu Bean

private LazyDataModel<ListaEspera> model;

	@Inject
	private Listas listas;

	private ListaFilter filtro;
	

	public PesquisaListaBean() {
		filtro = new ListaFilter();
		listasFiltradas = new ArrayList<>();
		model = new LazyDataModel<ListaEspera>() {

			private static final long serialVersionUID = 1L;

			@Override
			public List<ListaEspera> load(int first, int pageSize, String sortField, SortOrder sortOrder,
					Map<String, Object> filters) {
				filtro.setPrimeiroRegistro(first);
				filtro.setQuantidadeRegistros(pageSize);

				setRowCount(listas.quantidadeFiltrados(filtro));
				return listas.filtrados(filtro);
			}

		};

}

Não entendi essa parte. O que o lazy loading tem a ver com a ação de filtrar a pesquisa? Você quer apenas algumas informações iniciais no resultado da pesquisa e obter as outras na medida que for precisando?

Boa noite,
Esta é a pagina de pesquisa da lista de espera. O paciente pode ter o status de NOVO, ESPERA ou AGENDADO…quando ele entra na lista de espera ele recebe um status de ESPERA e quando é marcado a sua consulta ele passa a ter o status de AGENDADO. Sendo assim, nessa pesquisa teria que ter o filtro por nome como tem ai na pagina, mas nessa pagina mostraria somente os pacientes com o status de ESPERA usando o lazy loading. Deu pra entender?

<ui:define name="corpo">
	<h:form id="frmPesquisa">
		<h1>Pesquisar Lista</h1>

		<p:messages autoUpdate="true" closable="true" />

		<p:toolbar style="margin-top: 20px">
			<p:toolbarGroup>
				<p:commandButton value="Pesquisar" update="@form" />
			</p:toolbarGroup>
			<p:toolbarGroup align="right">
				<p:button value="Novo" outcome="/listas/CadastroLista" />
			</p:toolbarGroup>
		</p:toolbar>


		<p:panelGrid columns="2" id="painel"
			style="width: 100%; margin-top: 20px" columnClasses="rotulo, campo">

			<p:outputLabel value="Nome do Paciente" for="nomeal" />
			<p:inputText id="nomeal" size="40"
				value="#{pesquisaListaBean.filtro.nome}" />

		</p:panelGrid>

		<p:dataTable id="listasTable" value="#{pesquisaListaBean.model}"
			var="espera" lazy="true" style="margin-top: 20px"
			emptyMessage="Nenhum paciente encontrado." border="1"
			cellpadding="2" cellspacing="0" paginator="true"
			paginatorPosition="bottom" rows="6">

			<p:column headerText="Nome do Paciente" style="width: 250px;">
				<h:outputText value="#{espera.paciente.nome}" />
			</p:column>
			<p:column headerText="Identificação"
				style="width: 120px; text-align:center">
				<h:outputText value="#{espera.paciente.identificacao}" />
			</p:column>
			<p:column headerText="Telefone"
				style="text-align: center; width: 120px">
				<h:outputText value="#{espera.paciente.telefone}" />
			</p:column>
			<p:column headerText="Idade"
				style="text-align: center; width: 100px">
				<h:outputText value="#{espera.paciente.idade}" /> anos
			</p:column>
			<p:column headerText="Sexo" style="text-align: center; width: 100px">
				<h:outputText value="#{espera.paciente.sexo.descricao}" />
			</p:column>
			<p:column style="width:40px; text-align: center">

				<p:commandButton icon="ui-icon-trash" title="Excluir" immediate="true"
					oncomplete="PF('confirmacaoExclusao').show()" process="@this"
					update=":frmPesquisa:confirmacaoExclusaoDialog">
					<f:setPropertyActionListener value="#{espera}"
						target="#{pesquisaListaBean.listaSelecionada}" />
				</p:commandButton>
			</p:column>
		</p:dataTable>

		<p:confirmDialog header="Exclusão de Paciente"
			message="Tem certeza que deseja excluir o(a) paciente #{pesquisaListaBean.listaSelecionada.paciente.nome}?"
			widgetVar="confirmacaoExclusao" id="confirmacaoExclusaoDialog">
			<p:button value="Não"
				onclick="PF('confirmacaoExclusao').hide(); return false;" />
			<p:commandButton value="Sim"
				oncomplete="PF('confirmacaoExclusao').hide();"
				action="#{pesquisaListaBean.excluir}" process="@this"
				update=":frmPesquisa:listasTable" />
		</p:confirmDialog>

	</h:form>
</ui:define>

</ui:composition>

SIm. Entendi. E isso não tem a ver com lazy loading usando jpa/hibernate. O que você precisa fazer é chamar a consulta passando apenas o status que quer, retornando apenas os registros com o tal status. Para isso, você pode usar um método com a anotação @PostConstruct:

@PostConstruct
public void consultaInicial() {
	String status = "ESPERA"; // coloquei essa String apenas para exemplificar o status
	List<Paciente> pacientesEmEspera = service.consultarPacientes(status, <outros_parametros>);
	// ...
}

Com isso, ao entrar na tela, o sistema já irá pesquisar os pacientes com status em “ESPERA”.