Pessoal, gostaria de discutir com vcs a geração de SQL automático. Eu
tive umas idéias e quero saber a opinião de vcs sobre o assunto.
Uma das premissas do Infra é a flexibilidade. Por isso, eu idealizei
algo que traga a geração automática de SQL sem perder a flexibilidade.
Hoje, o Infra só permite a carga/alteração de objetos feita por meio
de templates. Mas, o meu desejo (e acredito que seja o de todos) é que
os templates sejam a exceção e não a regra.
A seguir, vcs poderão observar trechos de código, e antes que alguém
pergunte vou explicar logo: Eu também estou propondo uma mudança no
SQLCommand. Hoje, ele só retém o nome do template e os parâmetros. A
minha proposta é que ele possua uma propriedade SQL (como qualquer
componente de acesso a dados do delphi). Por que isso? Para que
possamos alterar o SQL como bem quisermos mesmo depois da geração
automática.
Vamos ao código:
//1º Caso)
//Geração de query automatica
vConfig := PersistenceService.GetConfiguration;
// Customizações aki
vSessionFactory := vConfig.BuildSessionFactory;
vSession := vSessionFactory.OpenSession;
// O session constrói um SQL automaticamente e
// lê o mapeamento de um arquivo em disco (pode ser um xml, por sua
flexibilidade)
// um possível layout de TAccount.xml é:
//<infra-mapping>
// <class name="accounts.Account" table="ACCOUNTS" alias="acc">
// <id name="id" column="ID">
// <generator name="ACCOUNTS_IDGEN"/>
// </id>
// <property name="Name" column="ACCOUNTNAME"/>
// <property name="AccountNumber" column="ACCOUNTNUMBER"/>
// <property name="InitialBalance" column="INITIALBALANCE"/>
// <property name="CurrentBalance" column="CURRENTBALANCE"/>
// </class>
//</infra-mapping>
// Acho que seria melhor ler o mapeamento de um arquivo pq o objeto
não precisa
// estar criado para se obter informações sobre ele, o que seria o
caso de se usar as anotações
vSQLCommand := vSession.CreateQuery('TAccount');
// o vSQLCommand deveria ter na sua propriedade SQL o seguinte
comando:
// select
acc.id, acc.accountnumber, acc.accountname,
acc.initialbalance, acc.currentbalance
// from accounts acc
// where
acc.id = :oid
// Agora, podemos especificar o objeto desejado
vSQLCommand.Params['oid'] := 10;
// Finalmente, o objeto é criado e suas propriedades setadas de
acordo com o
// mapeamento
vAccount := vSQLCommand.GetResult as IAccount;
//2º Caso)
// Leitura da query de um template
vConfig := PersistenceService.GetConfiguration;
// Customizações aki
vSessionFactory := vConfig.BuildSessionFactory;
vSession := vSessionFactory.OpenSession;
// Neste caso o session lê um arquivo da pasta de templates
vSQLCommand := vSession.CreateQueryFromTemplate
('SelectAccountByID');
// o CreateQueryFromTemplate já deveria carregar o conteúdo do
arquivo para
// para o vSQLCommand.SQL
// Agora, podemos especificar o objeto desejado
vSQLCommand.Params['oid'] := 10;
// Finalmente, o objeto é criado e suas propriedades setadas de
acordo com o
// mapeamento
vAccount := vSQLCommand.GetResult as IAccount;