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
