comment écrire Hibernate Critères à prendre des objets imbriqués par Projection Liste?
Je veux prendre des valeurs de l'objet Imbriqué dans Hibernate Liste de Projection. - Je avoir des Pojo "Charge" et "Tarif" de la classe avec OneToMany et relations ManyToOne.
Mon exemple de code est comme suit:
Charge
private String id;
private Tariff tariff;
private String name;
@OneToMany(cascade= {CascadeType.ALL},fetch=FetchType.EAGER,mappedBy="charge")
public Tariff getTariff() {
return tariff;
}
public void setTariff(Tariff tariff) {
this.tariff = tariff;
}
Tarif
private String id;
private String amount;
private Charge charge;
@ManyToOne(cascade={CascadeType.PERSIST},fetch=FetchType.EAGER)
@JoinColumn(name="charge_id")
public Charge getCharge() {
return charge;
}
public void setCharge(Charge charge) {
this.charge = charge;
}
Je veux profiter de la valeur du montant du tarif en charge de modèle.
J'écris critères sql qui fonctionne ie.
SÉLECTIONNEZ tarif.montant,la charge.nom DE charge,le tarif OÙ
charge.nom LIKE '%';
et j'ai essayé avec les critères suivants.
Criteria cr = getSession().createCriteria(Charge.class,"charge")
.createAlias("charge.tariff","tariff")
.setProjection(Projections.projectionList()
.add(Projections.property("chargeName"),"chargeName")
.add(Projections.property("id"),"id")
.add(Projections.property("tariff.amount"),"amount"))
.add(Restrictions.like("chargeName", name+"%"))
.setResultTransformer(Transformers.aliasToBean(Charge.class));
return cr.list();
Je viens de vérifier avec restclient elle renvoie la Valeur null. Comment écrire pour les Critères de la présente Requête sql ?
OriginalL'auteur Aravinthan K | 2015-03-10
Vous devez vous connecter pour publier un commentaire.
J'ai connu ce genre d'exigence. J'ai essayé d'obtenir des objets imbriqués comme des objets imbriqués à l'aide de
Transformers.aliasToBean
, qui ne fonctionnera pas. Par défaut,Transformers.aliasToBean
n'ont pas la possibilité de choisir des objets imbriqués comme objet imbriqué.Vous pouvez prendre un coup d'oeil à ma question
À l'aide de Projecions pour récupérer une colonne de table enfant
Pour obtenir l'objet Imbriqué comme objet imbriqué, vous avez besoin d'un Custom Transformateur qui est capable de faire ça.
Voici une Coutume Transformateur écrit par samiandoni
https://github.com/samiandoni/AliasToBeanNestedResultTransformer
Dans le fichier Readme dans le lien
Ci-dessus transformateur est capable de Récupérer des de premier niveau de l'objet Imbriqué comme objet Imbriqué et il ne prend pas en charge plus de profondeur des objets imbriqués. Donc après quelques recherches j'ai trouvé une autre Coutume, transformateur qui est capable de Récupérer profonde des objets Imbriqués comme des objets Imbriqués
Remarque:
Auteur:
Miguel Resendiz
Il suffit de remplacer samiandoni du Transformateur avec le au-dessus du transformateur. Il est capable de récupérer plus de profondeur des Objets Imbriqués comme des Objets respectifs.
Oui et Non. Vous pouvez toujours utiliser
AliasToBeanNestedResultTransformer
pourOneToMany (aka Collections)
, mais le résultat seraitindividual parent row for every child object
. Donc vous ne serez pas en mesure de le chercher comme des collections à l'intérieur de l'objet parent, seulement en tant que séparé de l'objet parent pour chaque enfant ligne. Je suis également à la recherche deAliasToBeanNestedResultTransformer
qui peuvent soutenirOneToMany (aka Collections)
Pour toute personne qui pourrait tomber sur cette réponse, Miguel Resendiz de l'original de la réplique a été mis à jour pour répondre
OneToMany
cas. Check it out ici - lienOriginalL'auteur The Coder
Ma solution est très simple. Ce n'est pas aussi propre qu'un bon résultat transformateur, mais c'est utile quand vous avez juste besoin de faire une rapide projection de quelques propriétés.
Au lieu de
.add(Projections.property("tariff.amount"),"amount"))
type
.add(Projections.property("tariff.amount"),"tariffAmount"))
Ensuite, il suffit d'ajouter un setter sur la racine de votre objet "setTariffAmount".
Elle a l'inconvénient de "souillures" votre objet avec des méthodes supplémentaires.
OriginalL'auteur otonglet
La AliasToBeanNestedResultTransformer ne gère pas le multi-niveaux Imbriqués de DTO. Ce qui signifie que vous ne serez pas en mesure de faire de l'entreprise.de l'employé.l'emplacement de chacun dans son propre DTO.
Ici est un Transformateur que j'ai écrit qui gère plusieurs niveaux Imbriqués Otd. Vous pouvez utilisé en l'appelant:
Espère que cela aide.
}
OriginalL'auteur Ronny Shibley