bonjour
j'utilise un framework de grille developpé en interne dans ma boite, du coup beaucoup de chose sont générées tel que certaines requetes dont une qui permet de récupérer la page ou se situe le produit modifié,cela permet de positionner la page ou se situe le produit, en effet si un tri sur la grille est actif par libellé et qu'on change le libellé du produit de AAA en ZZZ alors il faudra aller en derniere page et ne pas rester sur la premiere.
pour ce faire une requete est généré et récupère donc la partie basse de la requete d'affichage de la grille, la partie basse à partir du FROM et change uniquement le select
le tri étant effectué sur une colonne calculé
ce qui nous donne : (oui je sais la requete est pas mal mais tres rapide et fonctionne tres bien sur n'importe qu'elle tri sauf sur cette colonne calculé)
Code:
select produitAlias.id
from com.strator.iris.common.domain.Produit as produitAlias
left join produitAlias.stocks as stockAlias with stockAlias.groupeId = :groupeId and stockAlias.typeStock = 0
left join produitAlias.stocks as stockEnCoursAlias with stockEnCoursAlias.groupeId = :groupeId and stockEnCoursAlias.typeStock = 3
left join produitAlias.referenceProduitFournisseurPrivilegiee as refProdFouAlias
left join refProdFouAlias.informationReferenceTabac as infRefTabAlias
left join refProdFouAlias.informationReferenceERecharge as infRefERechargeAlias
left join produitAlias.categorieFamille.categorieActivite.metierNational as metierNationalAlias
left join refProdFouAlias.fournisseur as fournisseurAlias
left join infRefTabAlias.dateLivraisons as dateLivraisonAlias
left join refProdFouAlias.contenanceProduit as contenanceProduitAlias with contenanceProduitAlias.groupeId = 1
left join produitAlias.TVA as tvaAlias with tvaAlias.groupeId = :groupeId
where produitAlias.groupeId in (:groupeId)
and produitAlias.estProduitGenerique = false
and produitAlias.estReference = true
and produitAlias.typeProduit <> 5
and (dateLivraisonAlias.id is null or dateLivraisonAlias.DRDAltadis.id is null or dateLivraisonAlias.DRDAltadis.id = :drdDebitant)
and produitAlias.dateSuppression is null and produitAlias.produitParent is null
and (produitAlias.estActif = :estActif or stockAlias.quantite > 0)
and metierNationalAlias.codeMetierNational <> 2
and fournisseurAlias.typeFournisseur = 0
and refProdFouAlias.informationReferenceAutre is null
and refProdFouAlias.groupeId in (1, :groupeId)
order by (select case when produitIn.id is not null then cast( case when (produitIn.typeMargeProduit=3 and coalesce(stockin.quantite,0)>0) then cast(round(round(produitIn.prixDeVente*100/(1+produitIn.TVA.tauxTVA))/100)*stockin.quantite as long) when produitIn.typeMargeProduit=3 then (cast(0 as long)) when (produitIn.typeMargeProduit=1 and coalesce(produitAlias.prixAchat,0)>0 and coalesce(stockin.quantite,0)>0) then (round(round(round(produitAlias.prixAchat*100/coalesce(contenanceProduitAlias.quantiteUVparUC,1))/100)*100/coalesce(contenanceProduitAlias.quantiteUparUVC,1))/100*stockin.quantite) when (produitIn.typeMargeProduit=1 and coalesce(produitAlias.prixAchat,0)=0) then cast(0 as long) when (produitIn.typeMargeProduit=2 and coalesce(produitAlias.prixAchat,0)>0 and coalesce(stockin.quantite,0)>0) then (round(round(round(produitAlias.prixAchat*100/coalesce(contenanceProduitAlias.quantiteUVparUC,1))/100)*100/coalesce(contenanceProduitAlias.quantiteUparUVC,1))/100*stockin.quantite) when (produitIn.typeMargeProduit=2 and coalesce(produitAlias.prixAchat,0)=0 and coalesce(stockAlias.quantite,0)>0 and coalesce(produitIn.prixDeVente,0) >0 and coalesce(produitIn.coefficientDeMarge,0) >0 and coalesce(tvaAlias.tauxTVA,0) >0) then (((produitIn.prixDeVente)/((1+tvaAlias.tauxTVA)*produitIn.coefficientDeMarge))*stockin.quantite) else cast(0 as long) end as long) else 0 end from com.strator.iris.common.domain.Produit produitIn left outer join produitIn.stocks stockin where produitIn.produitParent = produitAlias.id ) asc
l'exception généré:
Code:
GRAVE: "Servlet.service()" pour la servlet FacesServlet a généré une exception
org.hibernate.hql.ast.QuerySyntaxException: unexpected AST node: query [...] <------ ICI se trouve la querry formatté au dessus donc je la supprime pour plus de lisibilité
at org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.java:54)
at org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.java:47)
at org.hibernate.hql.ast.ErrorCounter.throwQueryException(ErrorCounter.java:82)
at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:261)
je cherche desespérement pourquoi le order by ne passe pas et me génère cette erreur, peut etre qu'en lisant l'order by vous allez me dire que tel ou tel truc n'est pas encore géré dans hibernate ou alors THE solution :)
j'utilise hibernate
Code:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>3.3.2.GA</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-c3p0</artifactId>
<version>3.3.2.GA</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
<version>3.3.2.GA</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-annotations</artifactId>
<version>3.4.0.GA</version>
</dependency>
j'ai constaté lors de l'affichage de ma grille dans le select se trouve le hql qui est dans le order by car il s'agit d'une colonne affiché du coup il y a quelque chose comme cela de généré:
Code:
select (case when ...then...else...end case when ...then...else..end) col_0_1
join
where
order by col_0_1
si je tri par la colonne en question je retrouve dans le order by col_0_1 et non le case when... comme dans la requete qui me pose souci, je pensai avoir :
Code:
select (case when ...then...else...end case when ...then...else..end) col_0_1
join
where
order by (case when ...then...else...end case when ...then...else..end)
merci beaucoup d'avoir pris le temps de lire