Groupe par mois, avec des critères de Hibernate
Je vais essayer d'obtenir un rapport à l'aide de Critères et ProjectionList, et je suis assez nouveau à l'aide par le biais de cette mise en veille prolongée.
J'ai donc ce modèle:
private Long _userId;
private Category _category;
private Long _companyId;
private Double _amount;
private Date _date;
Et j'construction de la requête à l'aide de ceci:
public List sumPaymentsByUserCategoryPeriod(Category category, Long userId,Integer period){
GregorianCalendar from = new GregorianCalendar();
from.add(Calendar.MONTH, -period);
List<CategoryAmount> resultDTO= new ArrayList<CategoryAmount>();
Criteria criteria = getSession().createCriteria(Payment.class);
criteria.add(Restrictions.eq("_category", category));
criteria.add(Restrictions.eq("_userId",userId));
criteria.add(Restrictions.between("_date", from.getTime(), new Date()));
ProjectionList projectionList = Projections.projectionList();
projectionList.add(Projections.sum("_amount"));
projectionList.add(Projections.groupProperty("_date"));
criteria.setProjection(projectionList);
return criteria.list();
}
Fondamentalement, cette méthode recevoir une Catégorie et un code d'utilisateur pour filtrer les paiements des dossiers et une période, qui va indiquer le nombre de mois à partir de maintenant à dos, je veux somme. Comment puis-je obtenir la somme de résultats groupés par mois?
Toute aide ou conseil que je vais l'apprécier!
Vous devez vous connecter pour publier un commentaire.
J'ai trouvé la réponse, et c'est assez simple. J'ai changé le "groupProperty" dans le ProjectionList critères:
D'accord. Je vais vous expliquer la sqlGroupProjection. Le premier argument est la partie de la requête à l'issue de la "sélection", par exemple:
L' "{alias}" est l'alias qui hiberne utiliser dans la requête pour renvoyer à un tableau.
Le deuxième argument de la sqlGroupProjection fonction est le groupe par critères, le troisième argument est le nom de colonne que vous obtiendrez à partir du groupe par et enfin, le type de données que vous allez utiliser.
Vous pouvez utiliser un SQLQuery en veille prolongée, voici un exemple: