Como fazer um select de view no Spring Data JPA

16 respostas
javamysqlspringframework
M

Olá pessoal do GUJ, meu nome é Matheus e eu estou desenvolvendo um e-commerce para o meu TCC, porém encontrei um grande problema. Estou usando o framework Spring Boot para fazer minha aplicação e estou precisando puxar os registros de 3 Bancos de Dados diferentes que estejam dentro do MySQL. Para fazer isso eu fiz uma view que puxa esses registros deste 3 Bancos. O código desta view é:

create or replace view comparativo as
select * from maiseletro.product
union all
select * from tecnoshop.product
union all
select * from onebyte.product;

Sendo o maiseletro meu Banco, e os outros sendo espécies de fornecedores. Consegui fazer a view, mas na hora de puxar a view para a minha aplicação ela só está puxando os registros do meu Banco de Dados (maiseletro). Eu fiz tudo, fiz o meu DAO, fiz a minha entidade cujo o nome da tabela é o nome da view (comparativo), fiz services, fiz servicesimpl.
Enfim, estou precisando de ajuda, agradeço desde já quem puder me ajudar a resolver este problema.

PS.: Se precisar passar o código do DAO, da Entidade ou de outras classes, é só pedir. Tudo o que for preciso para resolver.

16 Respostas

D

Claro, o Spring Data é uma abstração do hibernate e só vai obter os dados que foram mapeados.

Sugestão: utilize o Spring JDBC. Vai ser mais fácil.

M

Eu entendo, e agradeço a resposta. Mas no Spring Data é possível fazer o que eu preciso? Porque eu já li que para mudar para JDBC, é mais demorado.

D

O spring data consegue gerenciar objetos. Estes objetos, devido ao mapeamento que você fez, estão amarrados à tabelas, certo?
O hibernate é capaz de mapear views como se mapeasse tabelas.
Portanto, é possível.
Agora, se isto é a melhor solução, tenho grandes dúvidas.

M

Certo, teria como me ajudar?

J

Posta o código que você tentou. Mas com JDBCTemplate o resultado é mais eficiente do que usando mega abstrações, e não trabalhoso quanto Jdbc puro.

D

Qual a dificuldade de mapear a view? No que está encontrando problemas?

M

Então brother até onde eu aprendi, tudo que eu precisava fazer para puxar a view do meu Banco de Dados para a minha aplicação, era colocar o nome da view em um @Table dentro da minha classe de Entidade. É preciso fazer alguma outra coisa a mais? Deixo aqui a minha classe Entidade Product:

@Entity

@Table(name=comparativo)

public class Product {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "product_id")
private Long id;
@Column(name = "name", nullable = false, unique = true)
@Length(min = 3, message = "*O nome do produto deve ter pelo menos 5 caracteres")
private String name;
@Column(name = "description")
private String description;
@Column(name = "price", nullable = false)
@DecimalMin(value = "0.00", message = "*O valor do produto não pode ter valor negativo")
private BigDecimal price;
@Column(name = "type", nullable = false)
private String type;
@Column(name = "quantity", nullable = false)
@Min(value = 0, message = "*A quantidade do produto não pode ter valor negativo")
private Integer quantity;
@Column(name = "forn", nullable = false, length= 250)
private String forn;
@Column(name = "img", nullable = false, length= 250)
private String img;

public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getDescription() {
    return description;
}

public void setDescription(String description) {
    this.description = description;
}

public BigDecimal getPrice() {
    return price;
}

public void setPrice(BigDecimal unitPrice) {
    this.price = unitPrice;
}

public String getType() {
	return type;
}

public void setType(String type) {
	this.type = type;
}

public Integer getQuantity() {
    return quantity;
}

public void setQuantity(Integer quantity) {
    this.quantity = quantity;
}

public String getForn() {
	return forn;
}

public void setForn(String forn) {
	this.forn = forn;
}

public String getImg() {
	return img;
}

public void setImg(String img) {
	this.img = img;
}

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;

    Product product = (Product) o;

    return id.equals(product.id);
}

@Override
public int hashCode() {
    return id.hashCode();
}

}

J

Qual SQL foi gerado?

M

Desculpa eu não entendi.

R

É isso mesmo, mapeie a sua view como se fosse uma tabela. Depois crie um repositório referente a essa view mapeada e pelo repositório crie as consultas normalmente como se estivesse fazendo para uma tabela.

J

Essa ferramenta que você usa não gera SQL?

M

Eu estou usando o Spring Data com Hibernate, e sim até gera. Mas tudo o que eu precisei fazer usar essa classe User com essas anotações, automaticamente ele gerou SQL mas para criar a tabela.O que eu preciso é só puxar a view do Banco de Dados para a minha aplicação. Tipo eu até estou conseguindo fazer isso, o problema é que dentro dessa view tem as informações de 3 Bancos de Dados diferentes, mas na minha aplicação só mostra de 1 BD.

D

Veja

M

Então brother, eu dei uma olhada e eu fiz exatamente do mesmo jeito que esse link. Claro adaptando para o meu projeto. O problema persiste.

D

Cara, você vai precisar analisar o SQL gerado, verificar se há alguma restrição com relação a isso na documentação. De resto, não tem muito o que fazer.

J

Não tem mágica, o banco é relacional, deverá ver o SQL gerado pelo mapeamento que você fez para a view, da mesma forma se fosse um Select para uma tabela. Caso contrário sempre vai desenvolver às cegas.

Criado 25 de março de 2018
Ultima resposta 28 de mar. de 2018
Respostas 16
Participantes 4