Hibernate Criteria Requête pour obtenir des colonnes spécifiques

J’utilise la requête de critères dans mon code. Il tire toujours select * from ...

Au lieu de cela, je veux négliger une colonne (champ) de ma requête car ce champ contient un grand nombre de données stockées en octets. Et cela cause un problème de performance.

Quelqu’un peut-il donner une idée pour cela?


Quelques mises à jour

J’ai ajouté une projection dans ma requête et créé une requête comme …

 select this_.TEMPLATE_ID as y0_, this_.TEMPLATE_NAME as y1_, this_.CREATE_DATE as y2_, this_.UPDATE_DATE as y3_, this_.STATUS_CODE as y4_, this_.USER_ID as y5_, this_.UPDATED_BY as y6_, this_.CATEGORY_ID as y7_, this_.PRACTICE_ID as y8_ from templates this_ inner join user user1_ on this_.USER_ID=user1_.USER_ID inner join template_categories category2_ on this_.CATEGORY_ID=category2_.CATEGORY_ID where y4_=? and y8_=? and y5_ in ( ?, ? ) order by y1_ asc limit ? 

Et maintenant, le problème est comme … La Unknown column 'y4_' in 'where clause' et la même erreur pour y8_, y5_ signifie pour tous les endroits où close a donné une erreur.

Je l’ai modifié en Requête comme …

 select this_.TEMPLATE_ID as y0_, this_.TEMPLATE_NAME as y1_, this_.CREATE_DATE as y2_, this_.UPDATE_DATE as y3_, this_.STATUS_CODE as y4_, this_.USER_ID as y5_, this_.UPDATED_BY as y6_, this_.CATEGORY_ID as y7_, this_.PRACTICE_ID as y8_ from templates this_ inner join user user1_ on this_.USER_ID=user1_.USER_ID inner join template_categories category2_ on this_.CATEGORY_ID=category2_.CATEGORY_ID where this_.STATUS_CODE=1 and this_.PRACTICE_ID=1 and this_.USER_ID in ( 1, 2 ) order by y1_ asc limit ? 

et ça a fonctionné. Mais je ne sais pas comment le modifier dans HQL?

Utilisez Projections pour spécifier les colonnes que vous souhaitez retourner.

Exemple

Requête SQL

 SELECT user.id, user.name FROM user; 

Hibernation Alternative

 Criteria cr = session.createCriteria(User.class) .setProjection(Projections.projectionList() .add(Projections.property("id"), "id") .add(Projections.property("Name"), "Name")) .setResultTransformer(Transformers.aliasToBean(User.class)); List list = cr.list(); 

Vous pouvez mapper une autre entité basée sur cette classe (vous devez utiliser le nom de l’entité pour distinguer les deux) et la seconde sera en quelque sorte dto (n’oubliez pas que dto a des problèmes de conception ). Vous devez définir le second comme étant en lecture seule et lui donner un bon nom pour indiquer clairement qu’il ne s’agit pas d’une entité régulière. par la façon de sélectionner seulement quelques colonnes s’appelle la projection, donc google avec ce sera plus facile.

alternative – vous pouvez créer une requête nommée avec la liste des champs dont vous avez besoin (vous les mettez dans la sélection) ou utilisez des critères avec projection