Avaliação do Tópico:
  • 1 votos - 5 Média
  • 1
  • 2
  • 3
  • 4
  • 5
Dúvida com JoinColumn
#1
Olá galera do ORMBr. Primeiramente parabéns ao Isaque e a todos os envolvidos pelo excelente projeto.

Tenho duas tabelas sendo PESSOA e CIDADE, conforme resumo abaixo:


PESSOA      | CIDADE
================
ID              | ID
NOME         | NOME
ID_CIDADE | UF

Estou tentando fazer uma JoinColumn (PESSOA.ID_CIDADE > CIDADE.ID), para que no momento da consulta o ORM traga o nome da cidade (CIDADE.NOME) e a UF (CIDADE.UF) de cada registro de pessoa, porém não estou conseguindo trazer o nome da cidade, somente a UF.

Pode ser pelo fato de que a coluna tenha o mesmo nome (NOME) nas duas tabelas?

Código que estou usando na classe TPessoaVO:

    [Restrictions([NoInsert, NoUpdate])]
    [Column('NOME', ftString, 100)]
    [JoinColumn('ID_CIDADE', 'CIDADE', 'ID', 'NOME', LeftJoin)]
    [Dictionary('Cidade')]
    property CidadeNome: string index 1 read FCidadeNome write FCidadeNome;

Eu até tentei trocar [Column('NOME', ftString, 100)] por [Column('NOME_CIDADE', ftString, 100)], porém recebo o erro: "Field 'NOME_CIDADE' not found".
Responder
#2
(15-05-2018, 07:19 PM)Pechoto Escreveu: Olá galera do ORMBr. Primeiramente parabéns ao Isaque e a todos os envolvidos pelo excelente projeto.

Tenho duas tabelas sendo PESSOA e CIDADE, conforme resumo abaixo:


PESSOA      | CIDADE
================
ID              | ID
NOME         | NOME
ID_CIDADE | UF

Estou tentando fazer uma JoinColumn (PESSOA.ID_CIDADE > CIDADE.ID), para que no momento da consulta o ORM traga o nome da cidade (CIDADE.NOME) e a UF (CIDADE.UF) de cada registro de pessoa, porém não estou conseguindo trazer o nome da cidade, somente a UF.

Pode ser pelo fato de que a coluna tenha o mesmo nome (NOME) nas duas tabelas?

Código que estou usando na classe TPessoaVO:

    [Restrictions([NoInsert, NoUpdate])]
    [Column('NOME', ftString, 100)]
    [JoinColumn('ID_CIDADE', 'CIDADE', 'ID', 'NOME', LeftJoin)]
    [Dictionary('Cidade')]
    property CidadeNome: string index 1 read FCidadeNome write FCidadeNome;

Eu até tentei trocar [Column('NOME', ftString, 100)] por [Column('NOME_CIDADE', ftString, 100)], porém recebo o erro: "Field 'NOME_CIDADE' not found".

Veja a Unit ormbr.model.master.pas la no exemplo ela mostra como fazer, testei e está funcionando.

  Isaque Pinheiro
  Fundador do Projeto ORM Brasil
  ORMBr SAC - Assine e faça parte dessa história ajudando o projeto a crescer.

Responder
#3
e como faço quando quero fazer um Join em duas tabelas diferentes que possuem um campo chamado NOME ?

por exemplo... uma tabela que possui Cliente e Fornecedor.. preciso trazer o nome do Cliente e do Fornecedor.

e os campos se chamam Nome..

sds,

Leandro
Responder
#4
(14-08-2018, 09:37 AM)aggille Escreveu: e como faço quando quero fazer um Join em duas tabelas diferentes que possuem um campo chamado NOME ?

por exemplo... uma tabela que possui Cliente e Fornecedor.. preciso trazer o nome do Cliente e do Fornecedor.

e os campos se chamam Nome..

sds,

Leandro

Bom dia Leandro o método JoinColumn() o último params é o Alias da coluna, foi criado justamente para esse tipo de situação.

  Isaque Pinheiro
  Fundador do Projeto ORM Brasil
  ORMBr SAC - Assine e faça parte dessa história ajudando o projeto a crescer.

Responder
#5
(15-08-2018, 09:14 AM)Isaque Pinheiro Escreveu:
(14-08-2018, 09:37 AM)aggille Escreveu: e como faço quando quero fazer um Join em duas tabelas diferentes que possuem um campo chamado NOME ?

por exemplo... uma tabela que possui Cliente e Fornecedor.. preciso trazer o nome do Cliente e do Fornecedor.

e os campos se chamam Nome..

sds,

Leandro

Bom dia Leandro o método JoinColumn() o último params é o Alias da coluna, foi criado justamente para esse tipo de situação.

Show de Bola... muito obrigado...
Responder
#6
Código:
   [Restrictions([NoInsert, NoUpdate])]
   [Column('client_name', ftString, 60)]
   [JoinColumn('client_id', 'client', 'id', 'client_name', InnerJoin)]
   [Dictionary('Nome do Cliente')]
   property client_name: string read fclient_name write fclient_name;

   [Restrictions([NoInsert, NoUpdate])]
   [Column('client_namenew', ftString, 60)]
   [JoinColumn('client_id', 'client', 'id', 'client_name', InnerJoin, 'client_namenew')]
   [Dictionary('Nome do Cliente New')]
   property client_namenew: string read fclient_namenew write fclient_namenew;

  Isaque Pinheiro
  Fundador do Projeto ORM Brasil
  ORMBr SAC - Assine e faça parte dessa história ajudando o projeto a crescer.

Responder
#7
Olá, boa tarde pessoal.
Tenho dois problemas com o JOINCOLUMN.

1º -

Tenho uma tabela IMOVEL, nela tenho dois campos que são chaves secundárias ( cli_codigo e cor_codigo ) os quais preciso fazer JOIN
com a tabela PESSOA, tenho o campo pes_codigo como chave primária.

Utilizando desta forma:

[Restrictions([NoInsert, NoUpdate])]
[Column('cliente_nome', ftString, 60)]
[JoinColumn('cli_codigo', 'pessoa', 'pes_codigo', 'pes_nome', InnerJoin, 'cliente_nome')]
[Dictionary('Nome do Cliente')]
property cliente_name: string read fcliente_name write fcliente_name;


[Restrictions([NoInsert, NoUpdate])]
[Column('corretor_nome', ftString, 60)]
[JoinColumn('cor_codigo', 'pessoa', 'pes_codigo', 'pes_name', InnerJoin, 'corretor_nome')]
[Dictionary('Nome do Corretor')]
property corretor_name: string read fcorretor_name write fcorretor_name;


Na 
procedure TDMLGeneratorAbstract.SetJoinColumn(AClass: TClass;
 ATable: TTableMapping; var ACriteria: ICriteria);

Não vai deixar adicionar o segundo JoinColumn devido a verificação:
if LJoinExist.IndexOf(LJoin.RefTableName) = -1 then

Vai entender que já existe a tabela PESSOA, evitando duplicidade de Alias.
O Resultado do Sql seria algo como:


SELECT imovel.imv_codigo, imovel.imb_codigo, imovel.cli_codigo, imovel.cor_codigo, imovel.imv_titulo, imovel.imv_descricao, 
pessoa.pes_nome AS cli_nome, pessoa.pes_nome AS cor_nome 
FROM imovel 
INNER JOIN pessoa ON pessoa.pes_codigo  = imovel.cli_codigo


Nesse caso, ele vai trazer nos dois o mesmo Nome.


Quando tenho este tipo de consulta, resolvo com Alias para "RefTableName"
algo como:


SELECT imovel.imv_codigo, imovel.imb_codigo, imovel.cli_codigo, imovel.cor_codigo, imovel.imv_titulo, imovel.imv_descricao, 
cliente.pes_nome AS cli_nome, corretor.pes_nome AS cor_nome 
FROM imovel 
INNER JOIN pessoa AS cliente ON cliente.pes_codigo  = imovel.cli_codigo
INNER JOIN pessoa AS corretor ON corretor.pes_codigo  = imovel.cor_codigo


2º -

Quando tenho uma Entidade que faz uma Association e, na entidade associada exista um JOINCOLUMN, apresenta a seguinte mensagem: 
Exception Class Name : Exception
Exception Message    : Problem when binding column "ftp_nome" - Field 'ftp_nome' not found


Entidade imobiliaria, faz associação com imobilidaria.fone a qual tem um JoinColumn com a entidade telefone.tipo.
Se abrir imobiliaria ocorre o erro acima.
Se abrir imobilidaria.fone apresenta o resultado sem o erro do campo.

Não encontrei nos exemplos algo que satisfizesse minhas necessidades.


Segue em anexo, projeto exemplo das entidades e banco em SqLite.

Grato.


Arquivo(s) anexado(s)
.zip   exemplo_problema.zip (Tamanho: 790.1 KB / Downloads: 99)
Responder
#8
(27-08-2018, 02:59 PM)valdirc Escreveu: Olá, boa tarde pessoal.
Tenho dois problemas com o JOINCOLUMN.

1º -

Tenho uma tabela IMOVEL, nela tenho dois campos que são chaves secundárias ( cli_codigo e cor_codigo ) os quais preciso fazer JOIN
com a tabela PESSOA, tenho o campo pes_codigo como chave primária.

Utilizando desta forma:

[Restrictions([NoInsert, NoUpdate])]
[Column('cliente_nome', ftString, 60)]
[JoinColumn('cli_codigo', 'pessoa', 'pes_codigo', 'pes_nome', InnerJoin, 'cliente_nome')]
[Dictionary('Nome do Cliente')]
property cliente_name: string read fcliente_name write fcliente_name;


[Restrictions([NoInsert, NoUpdate])]
[Column('corretor_nome', ftString, 60)]
[JoinColumn('cor_codigo', 'pessoa', 'pes_codigo', 'pes_name', InnerJoin, 'corretor_nome')]
[Dictionary('Nome do Corretor')]
property corretor_name: string read fcorretor_name write fcorretor_name;


Na 
procedure TDMLGeneratorAbstract.SetJoinColumn(AClass: TClass;
 ATable: TTableMapping; var ACriteria: ICriteria);

Não vai deixar adicionar o segundo JoinColumn devido a verificação:
if LJoinExist.IndexOf(LJoin.RefTableName) = -1 then

Vai entender que já existe a tabela PESSOA, evitando duplicidade de Alias.
O Resultado do Sql seria algo como:


SELECT imovel.imv_codigo, imovel.imb_codigo, imovel.cli_codigo, imovel.cor_codigo, imovel.imv_titulo, imovel.imv_descricao, 
pessoa.pes_nome AS cli_nome, pessoa.pes_nome AS cor_nome 
FROM imovel 
INNER JOIN pessoa ON pessoa.pes_codigo  = imovel.cli_codigo


Nesse caso, ele vai trazer nos dois o mesmo Nome.


Quando tenho este tipo de consulta, resolvo com Alias para "RefTableName"
algo como:


SELECT imovel.imv_codigo, imovel.imb_codigo, imovel.cli_codigo, imovel.cor_codigo, imovel.imv_titulo, imovel.imv_descricao, 
cliente.pes_nome AS cli_nome, corretor.pes_nome AS cor_nome 
FROM imovel 
INNER JOIN pessoa AS cliente ON cliente.pes_codigo  = imovel.cli_codigo
INNER JOIN pessoa AS corretor ON corretor.pes_codigo  = imovel.cor_codigo


2º -

Quando tenho uma Entidade que faz uma Association e, na entidade associada exista um JOINCOLUMN, apresenta a seguinte mensagem: 
Exception Class Name : Exception
Exception Message    : Problem when binding column "ftp_nome" - Field 'ftp_nome' not found


Entidade imobiliaria, faz associação com imobilidaria.fone a qual tem um JoinColumn com a entidade telefone.tipo.
Se abrir imobiliaria ocorre o erro acima.
Se abrir imobilidaria.fone apresenta o resultado sem o erro do campo.

Não encontrei nos exemplos algo que satisfizesse minhas necessidades.


Segue em anexo, projeto exemplo das entidades e banco em SqLite.

Grato.

Valdir, favor atualizar os fontes do ORMBr, no método JoinColumn() o último param agora vc pode definir o ALIAS TABLE, que resolverá essa situação de mais de 1 INNER JOIN na mesma tabela.

Já a outra situação "Imobiliaria", não é um erro do qual possamos resolver, pois foi a forma implementado que ocasionou, o Association() faz associação a uma TABELA do BANCO e não a uma CLASSE, por isso o erro, pois a classe tem um campos a mais que a tabela do banco.

Qual a forma correta? Para atender ao Association() a classe usada tem que ter a mesma estrutura do banco, e como vc quer um campo de outra tabela nessa classe e usa-la via associação, você deve criar uma VIEW com essa estrutura e criar uma classe para essa view, assim a VIEW e a classe terão a mesma estrutura, e ai funcionará.

Reforçando, isso só precisa se for usar a classe no Association().

  Isaque Pinheiro
  Fundador do Projeto ORM Brasil
  ORMBr SAC - Assine e faça parte dessa história ajudando o projeto a crescer.

Responder
#9
Bom dia Isaque,
Ficou excelente, obrigado mais uma vez.
Responder
#10
(30-08-2018, 08:54 AM)Isaque Pinheiro Escreveu: Já a outra situação "Imobiliaria", não é um erro do qual possamos resolver, pois foi a forma implementado que ocasionou, o Association() faz associação a uma TABELA do BANCO e não a uma CLASSE, por isso o erro, pois a classe tem um campos a mais que a tabela do banco.

Qual a forma correta? Para atender ao Association() a classe usada tem que ter a mesma estrutura do banco, e como vc quer um campo de outra tabela nessa classe e usa-la via associação, você deve criar uma VIEW com essa estrutura e criar uma classe para essa view, assim a VIEW e a classe terão a mesma estrutura, e ai funcionará.

Reforçando, isso só precisa se for usar a classe no Association().


Olá Isaque, somente para constar.
Após Branches do dia 16/09/18, não preciso mais utilizar a view para minha Association.
Responder


Possíveis Tópicos Relacionados...
Tópico: Autor Respostas: Visualizações: Última Mensagem
  Duvida no projeto RRPereira 9 6,017 14-05-2017, 08:43 AM
Última Mensagem: Isaque Pinheiro

Saltar Fórum:


usuários a ver este tópico: 1 Visitante(s)