2011-02-03 15 views
5

EDITAR: Específicamente hablando de consultas sin tabla. Sí puedo usar existe, pero tendría que hacerCómo seleccionar si existe una fila en HQL

select case when exists (blah) then 1 else 0 end as conditionTrue 
from ARealTableReturningMultipleRows 

En T-SQL que puedo hacer:

select case when exists(blah) then 1 else 0 end as conditionTrue 

En Oracle que puedo hacer:

select case when exists(blah) then 1 else 0 end as conditionTrue from DUAL 

¿Cómo puedo lograr lo mismo en HQL?

select count() parece ser la segunda mejor alternativa, pero no quiero tener que procesar cada fila en la tabla si no es necesario.

+0

echar un vistazo a esta pregunta: http://stackoverflow.com/questions/3672444/where-exists-in-hibernate-hql –

Respuesta

1

Respuesta corta: Creo que NO es posible.

Mi razonamiento:

Según Where can I find a list of all HQL keywords? proyecto Hibernate HQL no publica la gramática en su página web, que está disponible en la distribución total Hibernate como un archivo .g antlr sin embargo.

no tengo mucha experiencia con .g archivos de antlr, pero se puede encontrar esto en el archivo (hibernate-distribution-3.6.1.Final/project/core/src/main/antlr/hql.g):

selectFrom! 
     : (s:selectClause)? (f:fromClause)? {                          
       // If there was no FROM clause and this is a filter query, create a from clause. Otherwise, throw         
       // an exception because non-filter queries must have a FROM clause.                
       if (#f == null) {                             
         if (filter) {                            
           #f = #([FROM,"{filter-implied FROM}"]);                   
         }                               
         else                              
           throw new SemanticException("FROM expected (non-filter queries must contain a FROM clause)");      
       }                                 

que indica claramente que hay algunos HQL consulta que no tiene cláusula de FROM, pero eso es aceptable si es una consulta de filtro. Ahora, de nuevo, no soy un experto en HQL/Hibernate, pero creo que una consulta de filtro no es una consulta completa sino algo que define usando session.createFilter (vea How do I turn item ordering HQL into a filter query?), así que eso me hace pensar que no hay forma de omitir la cláusula FROM.

+0

¡Es una gran investigación, muchas gracias! Voy a marcar esto como la respuesta aceptada por el momento, con la esperanza de que algún día su respuesta ya no sea correcta. =) –

0

De acuerdo con http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html#queryhql-expressions, parece que admiten ambas sentencias case y exists.

+0

Editted la pregunta para reflejar mejor lo que quería decir. Perdon por confundirte. –

+0

Ah, ya veo, se ve muy similar a una pregunta que hice hace años que no obtuvo respuestas. Si obtiene uno que funcione, quizás considere agregarlo a mi pregunta. http://stackoverflow.com/questions/808543/select-constant-in-hibernate – digitaljoel

1

Uso la tabla falsa con una fila, por ejemplo MyDual.

select case when exists(blah) then 1 else 0 end as conditionTrue from MyDual 
Cuestiones relacionadas