DClick

Arquivos da categoria "Java"

Utilizando funções aninhadas no Hibernate

Categorias relacionadas: Hibernate, Java
Twitter!

Quem utiliza Criteria já deve ter precisado utilizar funções aninhadas ( como sum(abs(propriedade)) ). Infelizmente a class Projections não dispoem deste recurso, e a classe que implementa as agregações ( AggregateProjection ) não foi projetada pensando nisso.

Baseado na class AggregateProjection implementei uma solução com um construtor que recebe um array de string com as funções a serem aninhadas na ordem do array

Leia o artigo completo »

Por Daniel Passos em 4/December/2007
2 Comentários »


No Translations

Implementando Criterion para utilizar Extract do Oracle

Categorias relacionadas: Hibernate, Java
Twitter!

Ontem meu amigo Filipe Sabella queria executar uma função para manipulação de data do Oracle utilizando Criteria. Algo do tipo funcao_do_oracle( columa ) = ?

O Hibernate não implementa esse tipo de funcionalidade, mas por ter seu desenvolvimento baseado em interfaces lhe possibilita extender / criar (quase) toda e qualquer funcionalidade que deseje. Depois de dar o caminho das pedras, dizendo que era "so" implementar Criterion e algumas alterações para deixarmos a mesma compativel com 1.4 chegamos a seguinte solução:

JAVA:
  1. package br.com.dclick.hibernate.criterion.oracle;
  2.  
  3. import org.hibernate.Criteria;
  4. import org.hibernate.EntityMode;
  5. import org.hibernate.Hibernate;
  6. import org.hibernate.HibernateException;
  7. import org.hibernate.criterion.CriteriaQuery;
  8. import org.hibernate.criterion.Criterion;
  9. import org.hibernate.engine.TypedValue;
  10.  
  11. public class ExtractFunctionExpression implements Criterion {
  12.  
  13.     private static final class ExtractType {
  14.  
  15.         private String function;
  16.  
  17.         private ExtractType( String function ) {
  18.             this.function = function;
  19.         }
  20.  
  21.         public String toString() {
  22.             return function.toString();
  23.         }
  24.  
  25.     }
  26.  
  27.     public static final ExtractType YEAR = new ExtractType( "YEAR" );
  28.     public static final ExtractType MONTH = new ExtractType( "MONTH" );
  29.     public static final ExtractType DAY  = new ExtractType( "DAY" );
  30.    
  31.     private String property;
  32.     private String value;
  33.     private ExtractType extractType;
  34.    
  35.     public ExtractFunctionExpression( String property, ExtractType extractType, String value ) {
  36.         this.property = property;
  37.         this.extractType = extractType;
  38.         this.value = value;
  39.     }
  40.  
  41.     public TypedValue[] getTypedValues( Criteria criteria, CriteriaQuery criteriaQuery ) throws HibernateException  {
  42.         return new TypedValue[] { new TypedValue( Hibernate.STRING, value, EntityMode.POJO ) };
  43.     }
  44.  
  45.     public String toSqlString( Criteria criteria, CriteriaQuery criteriaQuery ) throws HibernateException {
  46.         String column = criteriaQuery.getColumnsUsingProjection( criteria, property )[ 0 ];
  47.         return "( extract(" + extractType.toString() + " from " + column + " ) = ? )";
  48.     }
  49.  
  50. }

Pronto. Agora e so adicionar ao seu criterio:

JAVA:
  1. HibernateSessionFactory.getSession()
  2. .createCriteria(Venda.class)
  3. .add( new ExtractFunctionExpression("dataVenda", ExtractFunctionExpression.YEAR, "2007") )
  4. .list();

Por Daniel Passos em 14/November/2007
2 Comentários »


No Translations

Por que popular apenas o necessário?

Categorias relacionadas: Hibernate, Java
Twitter!

Meu primeiro post neste blog gerou algumas duvidas que rendem ate hoje alguns emails sobre o porque de se popular apenas o necessário.

A maioria dos projetos onde utilizamos Hibernate, a camada de front end e de back end são Java.

Em um simples cenário onde temos uma combo a qual precisamos apenas do Id e do Nome de uma determinada classe que em seu total dispõem de muitos atributos, fazemos a pesquisa normalmente com o Hibernate que popula todos seus atributos mandamos pra camada de front end ( JSP por exemplo ) que esta preparada para utilizar apenas o Id e o Nome da class transformando apenas as informações necessários para a tela do usuário em um HTML, dispensando os dados que não serão utilizando. Tudo isso no lado do Servidor. A consulta por 2 ou 30 campos em sua maioria não faz "tanta" diferença para o banco e a transformação em dados desnecessário em HTML quando front end e back end estão no mesmo servidor ( não sendo aplicações realmente distribuídas ) também não faz "tanta" diferença.

Porem quando utilizamos flex no front end estamos trafegando uma imensidão ( exagerei? ) de dados desnecessariamente, forçando a maquina do usuário a tratar todos esses dados que em sua maioria não serão utilizados. Algumas vezes a coisa pode se tornar ainda pior quando precisamos guardar essas instâncias no model, ficando com uma serie de dados desnecessário no cliente.

Por Daniel Passos em 6/July/2007
2 Comentários »


No Translations

Implementando PropertySelector para utilizar como Example no Hibernate

Categorias relacionadas: Hibernate, Java
Twitter!

A algum tempo atrás alguém perguntou no GUJ se o Hibernate fazia consultas (utilizando Criteria) excluindo propriedades vazias ( "" ).

Nativamente o Hibernate não dispoem desses recurso, porem utilizando Example podemos implementar PropertySelector para faze-lo exatamente como implementação do Example.excludeZeroes()

Exemplo de PropertySelector

JAVA:
  1. public final class NotNullOrBlankPropertySelector implements PropertySelector {
  2.     public boolean include(Object object, String propertyName, Type type) {
  3.        return object!=null && (
  4.           !(object instanceof String) || !( (String) object ).equals("")
  5.        );
  6.     }
  7. }

Como utilizar

JAVA:
  1. HibernateUtil.getSession()
  2.  .createCriteria(SuaEntidade.class)
  3.  .add( Example.create(suaInstancia).setPropertySelector(new NotNullOrBlankPropertySelector()) )
  4.  .list();

Por Daniel Passos em 29/June/2007
Nenhum Comentário »


No Translations

Usando o Data Management do FDS através de um sevlet

Categorias relacionadas: Flash Lite, Flex Data Services, Java, RIA
Twitter!

Estamos fazendo alguns protótipos para celular usando o Flash Lite (em breve em Demos) e um dos requisitos desses protótipos seria atualizar uma interface Flex em tempo real. Já havíamos usado a funcionalidade do Data Management em alguns projetos, mas em todos eles o próprio Flex foi o gerador e o consumor das informações, ou seja, o update, delete e insert dos Assembler partiam de uma interface Flex para o servidor e automaticamente o FDS diparava os selects (fills) para os clientes conectados a um determinado destination. Neste caso, os exemplos da Adobe funcionam normalmente e podemos nos basear na documentação para fazer as aplicações. Mas e se eu quisesse usar o Data Management e tivesse um .jsp ou um servlet processando minhas requisições?
Leia o artigo completo »

Por Rafael Martinelli em 16/May/2007
1 Comentário »


No Translations

Debugando Query do Hibernate

Categorias relacionadas: Hibernate, Java
Twitter!

Esta semana tive um problema com uma query que teoricamente estava certa mas não estava exatamente fazendo o que eu queria.

A primeira opção para debugar é setar o atributo show_sql = true e verificar a query que está sendo montada. Outra otima opção que pode ajudar muito e economizar tempo, é setar a propriedade format_sql = true.

Porem em nenhuma delas você terá acesso as variáveis que estão sendo setadas na sua query. Caso você tenha configurado o log4j.properties provavalmente as variaves serão gravadas em arquivo ( caso você assim o tenha configurado ) mas dificilmente está será mostrada no console. Geralmente configuramos o log4j.properties para logar tudo (ALL) com isso dificultando nosso trabalho para encontrar alguma coisa quanto realmente precisamos. O projeto caveatemptor (projeto do livro Java Persistence with Hibernate) trás uma ótima sugestão de arquivo de configuração para debugar as querys que estão sendo geradas.

# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{6}:%L - %m%n

# Root logger option
log4j.rootLogger=WARN, stdout

# Log JDBC bind parameter runtime arguments
log4j.logger.org.hibernate.type=DEBUG

A grande sacada do arquivo acima e logar apenas as classes do pacote org.hibernate.type com isso você terá em seu console a query ( formatada ) e as variáveis que foram setadas na execução da mesma. Apenas o necessário para entender o que esta acontecendo!

Por Daniel Passos em 9/April/2007
3 Comentários »


No Translations

A primeira experiência em Flex o programador Java nunca esquece

Categorias relacionadas: ActionScript, Flex, Java, RIA
Twitter!

Olá, meu nome é Filipe e vou falar sobre minha experiência de transição para a plataforma Flex utilizando remoting com Java.

Sou desenvolvedor há quatro anos, trabalhando principalmente com Java para web, mas também com sólida experiência com desenvolvimento de aplicativos desktop.

Após estudar algumas apostilas de Flex resolvi criar uma pequena aplicação Todo. A aplicação possui apenas 4 telas:

loginlista de tasksalterar a senhacontrole de usuários

Achei o desenvolvimento com o Flex bastante natural, dada minha experiência com Swing, XUL e Laszlo. Do Swing aproveitei a forma como se trata e trafega dados entre o servidor e o cliente - nada de HTTP e Strings para lá e para cá. Portanto já estava acostumado a esta forma de pensar soluções.
Do XUL e Laszlo aproveitei a forma como a interface é declarada com databinding e datasources - consideravelmente diferente de HTML. Portanto também já estava acostumado a resolver problemas com estas ferramentas.

O desenvolvimento de interfaces com Flex brilhou para mim com as features de transições, efeitos e, principalmente, estados. São ferramentas que não vi aplicadas desta forma transparente em nenhuma outra tecnologia, e realmente facilitam o desenvolvimento de uma aplicação mais suave, bem como melhoram em muito a experiência do usuário final. O esforço para criar uma aplicação bonita e leve é centenas de vezes menor utilizando Flex do que utilizando Swing/SWT/Thinlet ou HTML + Milhares de Linhas de Javascript.

Uma conclusão interessante é que o MXML junta o melhor dos mundos web e desktop. Da parte web a tecnologia provê a facilidade de distribuição do software e de programar as interfaces utilizando uma linguagem de marcação, que é muito mais simples que código Java.
Da parte desktop a tecnologia herda a adequação, riqueza e customização - é uma linguagem feita para produzir interfaces de aplicações, não são necessárias "gambiarras", muito menos código de compatibilidade, pois o runtime é sempre o mesmo. Como disse Bruce Eckel em seu mais recente artigo, The Web Is A Mess. E o Flex existe para resolver este problema.

A parte de remoting é extremamente simples e transparente. Há uma enorme diferença entre o desenvolvimento com RPC e HTTP puro. Não ter que lidar com as incompatibilidades entre os browsers ou centenas de linhas de código Java promove um desenvolvimento mais voltado para a aplicação em si.
Me senti um pouco desconfortável sendo obrigado a declarar getters e setters públicos nos VOs em Java, mas sendo que estes objetos servem apenas como "comidinha de rede" e não participam dos objetos de domínio da aplicação, não é um problema ter que quebrar o encapsulamento deles.

ActionScript 3.0 é uma linguagem poderosa e, pela pouca experiência que tive, percebi que faz o trabalho de qualquer outra linguagem de programação de quarta geração. Contudo, senti falta de sobrecarga de métodos.

A título de aprendizado, resolvi não utilizar o Cairngorm para entender melhor os problemas que este framework resolve. Apesar da aplicação ser minúscula, me encontrei gastando tempo procurando qual tela possuía os métodos chamados por outra e também dificuldades para padronizar as chamadas remotas. Conclusão óbvia: é necessário um padrão de desenvolvimento que promova, entre outras coisas, a separação das soluções para os problemas comuns.

Em conclusão, a transição para o Flex foi suave, rápida, simples e interessante - como a plataforma. Recomendo que qualquer desenvolvedor Java, independente da experiência passada, dê uma chance à plataforma e pare de ganhar cabelos brancos tentando fazer seu HTML funcionar em todos os browsers ou fazer uma interface em Swing que não faça o usuário torcer o nariz.

Por Filipe Sabella em 14/February/2007
20 Comentários »


No Translations