Consulta com varias tabelas

5 respostas
jaissonduarte

e ai pessoal
tenho um banco com varias tabelas e estou fazendo a seguinte consulta:

select doc.titulo as Título, p.nome as Autor, a.descricao as Área, c.curso as Curso from documento doc join curso c on c.codigo = doc.curso join area a on a.codigo = doc.area join documento_autor da on doc.codigo = da.cod_doc join pessoa p on p.codigo = da.cod_autor WHERE doc.titulo LIKE '%a%';

em SQL ele roda muito bem, mas tenho algumas dúvidas de como otimizar ou dar uma melhorada nele o que vocês achariam melhor alterar?
segunda questão: como estou usando N x N em Documento e Autor, a consulta vai trazer vários autores para o mesmo documento, isso ficaria feio numa tela XHTML, tem como eu pegar apenas o primeiro
terceira: como ficaria em NamedQuery o meu ficou assim:

@NamedQuery(name="pesquisa", query= "select doc.titulo as Título,"+ "p.nome as Autor,"+ "a.descricao as Área,"+ "c.curso as Curso"+ "from documento doc"+ "join curso c on c.codigo = doc.curso"+ "join area a on a.codigo = doc.area"+ "join documento_autor da on doc.codigo = da.cod_doc"+ "join pessoa p on p.codigo = da.cod_autor"+ "WHERE doc.titulo LIKE :titulo"),
notem como esta a minha classe:

public class Documento implements Serializable { private static final long serialVersionUID = 1L; @Id @Basic(optional = false) @GeneratedValue(strategy= GenerationType.IDENTITY) @Column(name = "codigo") private Integer codigo; @Basic(optional = false) @NotNull @Size(min = 1, max = [telefone removido]) @Column(name = "resumo") private String resumo; @Basic(optional = false) @NotNull @Size(min = 1, max = 30) @Column(name = "tipo") private String tipo; @Basic(optional = false) @NotNull @Column(name = "ano") private int ano; @Basic(optional = false) @NotNull @Size(min = 1, max = [telefone removido]) @Column(name = "titulo") private String titulo; @Basic(optional = false) @NotNull @Size(min = 1, max = [telefone removido]) @Column(name = "caminho") private String caminho; @JoinTable(name = "documento_autor", joinColumns = { @JoinColumn(name = "cod_doc", referencedColumnName = "codigo")}, inverseJoinColumns = { @JoinColumn(name = "cod_autor", referencedColumnName = "codigo")}) @ManyToMany private List<Pessoa> pessoaList; @JoinTable(name = "documento_palavra", joinColumns = { @JoinColumn(name = "cod_documento", referencedColumnName = "codigo")}, inverseJoinColumns = { @JoinColumn(name = "cod_palavra", referencedColumnName = "codigo")}) @ManyToMany private List<PalavraChave> palavraChaveList; @JoinColumn(name = "instituicao", referencedColumnName = "codigo") @ManyToOne(optional = false) private Instituicao instituicao; @JoinColumn(name = "curso", referencedColumnName = "codigo") @ManyToOne(optional = false) private Curso curso; @JoinColumn(name = "area", referencedColumnName = "codigo") @ManyToOne private Area area;

a minha consulta esta certa?
valeu

5 Respostas

hilton.silva

tenta trocar a parte ("…LIKE :titulo") por ("…LIKE ‘%titulo%’")

jaissonduarte

cara então tu acha que está tudo Ok
bom o LIKE eu uso mais tarde tipo

setParameter("titulo", "%"+documento.getTitulo()+"%"); :smiley:
então não tem outra forma, não adiante reinventar a roda que não da
é isso e deu? :?:

hilton.silva

Então, nos projetos que participo, constumo usar um arquivo .properties para armazenar as consultas. Acho e voce deve conhecer né?!
Ainda nao analisei a sua classe pra entender como que vc está usando as consultas.

Vou pesquisar aqui também e qualquer coisa eu posto aqui.

P

Olá, não percebi exactamente o que vc quer dizer com “tem como eu pegar apenas o primeiro”?
Voçê quer apenas o a primeira linha do resultado da querie? Se sim isso é fácil…

WRYEL

Se você quer melhorar o tempo de resposta, a premissa básica para joins é saber criar as FK (chaves estrangeiras) corretamente.
Se você utilizar frequentemente a coluna titulo para consulta, você pode considerar criar um indice parcial da coluna, ao invez de um total.

[]'s

Criado 13 de abril de 2012
Ultima resposta 13 de abr. de 2012
Respostas 5
Participantes 4