Recuperar PDF do Banco de Dados e mostrar ele na tela

Boa tarde pessoal,

Estou com uma dificuldade em fazer o seguinte:

Tenho uma aplicação WEB, usando JSF e Primefaces e MYSQL.
Tem uma tela de cadastro de produto e nele preciso selecionar um PDF, eu consegui anexar esse PDF e da um “insert” no Banco como “BLOB”, porém na hora de listar, não estou conseguindo.

O que preciso… Dar um select nessa tabela e mostrar o PDF para o cliente, porém não estou conseguindo…

ProdutoDAO

    StringBuilder sql = new StringBuilder();
	sql.append("SELECT idProcesso, Processo");
	sql.append(" FROM processos ");
	sql.append(" ORDER BY idProcesso ASC");

	Connection conexao = ConexaoFactory.conectar();

	PreparedStatement comando = conexao.prepareStatement(sql.toString());

	ResultSet resultado = comando.executeQuery();

	ArrayList<Processos> lista = new ArrayList<Processos>();

	while (resultado.next()) {

		Processos item = new Processos();
		item.setArquivo("select no campo PDF,");
		item.setIdProcessos(resultado.getInt("idProcesso"));

		lista.add(item);
	}

	return lista;
}

Processo.xhtml

			<p:column headerText="Processo do Cliente">

				<p:outputPanel id="read">
					<p:media value="#{item.arquivo}" player="pdf" /> >
				</p:outputPanel>
			</p:column>

Sou novo, então se precisar mais informações, eu adiciono depois.

Novato não faz coisas assim, fera. Novato estuda o básico da linguagem, se chegou aqui, já deixou de ser novato ou está pulando etapas, o que vai trazer muitos outros problemas além deste.

O atributo arquivo, da classe Processos(por que a classe tem nome no plural?) é um byte[]?

Você realmente tem um banco de dados que guarda PDF?
Estou trabalhando com algo parecido, mas ao invés de guardar pdf eu guardo o caminho (Path) de onde o arquivo esta armazenado no servidor.

No meu caso eu acho mais fácil pois guardando o caminho eu só preciso executar a seguinte linha

java.awt.Desktop.getDesktop().open(new File(caminho));

As duas maneiras são possíveis.

Você está usando desktop, fera, isso muda muito as coisas.

Não, eu tinha tentando de várias formas… agora ela esta como String, pois eu ia tentar usando o path do PDF.
Porém achei que não seria do melhor jeito.
O que não estou conseguindo é dar o select nessa tabela e converter do BLOB para o arquivo PDF.

É relativamente simples fazer isso, desde que o arquivo seja, efetivamente, PDF.
O arquivo armazenado no banco de dados, na coluna BLOB é um array de bytes ou byte[], por isso a minha primeira pergunta.
A partir do momento que você lê essa coluna, você pode fazer o seguinte:

OutputStream out = response.getOutputStream();
FileInputStream in = new FileInputStream(arrayQueContemOArquivo);
byte[] buffer = new byte[4096];
int length;
while ((length = in.read(buffer)) > 0){
    out.write(buffer, 0, length);
}
in.close();
out.flush();

Isso vai enviar o arquivo pro browser do usuário. Mas, veja, é extremamente importante ler esse byte[] da coluna BLOB.

Legal… vou fazer desta forma, mas a outra duvida é como vou mostrar isso no primefaces, pois tentei de algumas formas e nao deu nenhuma.

Nessa hora:

			<p:column headerText="Processo do Cliente">

				<p:outputPanel id="read">
					<p:media value="#{item.arquivo}" player="pdf" /> >
				</p:outputPanel>
			</p:column>

Fera, para isso você tem que se certificar que o primefaces tem algum componente que suporta renderização de pdf.
Se tiver, o que eu realmente não sei, pois faz muito tempo que não desenvolvo com prime ou jsf, aí você precisa ajustar de acordo com o que o primefaces demanda.
O exemplo que sugeri vai enviar o PDF como arquivo e o browser vai entender que deve ser um download.