Data Parcial

2 respostas
C

Olá pessoal,

Usando EclipseLink e Postgresql é possivel fazer uma busca em um campo que está como Date no sql, no formato 'yyyy-MM-dd', de uma parte da data da data, ou seja, buscar todos por um determinado ano('yyyy') ou por um determinado mes e ano('mm/YYYY').

Fiz a parte de comparação de datas dessa forma:

to_date(p.validade,'YYYY-MM') = to_date(:MesEAno,'YYYY-MM')

to_date(c.validade,'YYYY') = to_date(:Ano,'YYYY')

Eu tentei assim, mas não deu certo.

Caused by: Exception [EclipseLink-8025] (Eclipse Persistence Services - 2.2.0.v20110202-r8913): org.eclipse.persistence.exceptions.JPQLException
Internal Exception: NoViableAltException(83@[()* loopback of 383:9: (d= DOT right= attribute )*])
	at org.eclipse.persistence.exceptions.JPQLException.unexpectedToken(JPQLException.java:372)
	at org.eclipse.persistence.internal.jpa.parsing.jpql.JPQLParser.handleRecognitionException(JPQLParser.java:320)
	at org.eclipse.persistence.internal.jpa.parsing.jpql.JPQLParser.addError(JPQLParser.java:246)
	at org.eclipse.pers
SEVERE: istence.internal.jpa.parsing.jpql.JPQLParser.reportError(JPQLParser.java:363)
	at org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.pathExprOrVariableAccess(JPQLParser.java:1436)
	at org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.arithmeticPrimary(JPQLParser.java:4720)
	at org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.arithmeticFactor(JPQLParser.java:4660)
	at org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.arithmeticTerm(JPQLParser.java:4546)
	at org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.simpleArithmeticExpression(JPQLParser.java:4462)
	at org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.arithmeticExpression(JPQLParser.java:4402)
	at org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.simpleConditionalExpression(JPQLParser.java:3321)
	at org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.conditionalPrimary(JPQLParser.java:3275)
	at org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.conditionalFactor(JPQLParser.java:3194)
	at org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.conditionalTerm(JPQLParser.java:3127)
	at org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.conditionalExpression(JPQLParser.java:3029)
	at org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.whereClause(JPQLParser.java:2986)
	at org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.selectStatement(JPQLParser.java:380)
	at org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.document(JPQLParser.java:281)
	at org.eclipse.persistence.internal.jpa.parsing.jpql.JPQLParser.parse(JPQLParser.java:134)
	at org.eclipse.persistence.internal.jpa.parsing.jpql.JPQLParser.buildParseTree(JPQLParser.java:95)
	at org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:212)
	at org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:187)
	at org.eclipse.persistence.internal.jpa.EJBQueryImpl.<init>(EJBQueryImpl.java:139)
	at org.eclipse.persistence.internal.jpa.EJBQueryImpl.<init>(EJBQueryImpl.java:123)
	at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery(EntityManagerImpl.java:1376)
	... 68 more
Caused by: NoViableAltException(83@[()* loopback of 383:9: (d= DOT right= attribute )*])
	at org.eclipse.persistence.internal.libraries.antlr.runtime.DFA.noViableAlt(DFA.java:159)
	at org.eclipse.persistence.internal.libraries.antlr.runtime.DFA.predict(DFA.java:116)
	at org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.pathExprOrVariableAccess(JPQLParser.java:1408)
	... 88 more

Obs: eu pego uma String da tela,mas converto ela para Date antes de passa-la para o SQL, para em vez de ficar 'mm/yyyy', passe a ser 'yyyy-mm'.

Abraços.

2 Respostas

H

E ae crisirado.

Eu acho que para resolver o seu problema poderá fazer assim:

to_char(p.validade,'YYYY-MM') = :MesEAno

Onde o seu

p.validade

é do tipo Date e você passa para a comparação uma string.

Acho que dessa forma você pode resolver o problema.

Valeu!

C

Olá haamilton, tentei, mas não deu certo não :cry: :frowning:

Considerando que a entrada seria sempre uma String, testei o modo sugerido:

E tentei da seguinte forma:

Em ambas o erro sugeria um: unexpected token [(].

Como no select só existem parenteses nessa parte da expressão, logo o erro está nessa parte da verificação da data.

Talvez isso no EclipseLink não funcione. Não testei isso no Hibernate.

Acho que vou ter que fazer o que me recomendaram não fazer: um createNativeQuery.

Se alguém tiver uma outra idéia posta ai!

Demais obrigado a todos.

Abraços,o jeito é continuar tentando. :smiley:

Criado 27 de julho de 2011
Ultima resposta 28 de jul. de 2011
Respostas 2
Participantes 2