Revision 5e62e156
Added by Patrick Plitzner about 6 years ago
cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/occurrence/OccurrenceDaoHibernateImpl.java | ||
---|---|---|
19 | 19 |
import org.hibernate.Hibernate; |
20 | 20 |
import org.hibernate.Query; |
21 | 21 |
import org.hibernate.Session; |
22 |
import org.hibernate.criterion.Disjunction; |
|
22 | 23 |
import org.hibernate.criterion.Projections; |
23 | 24 |
import org.hibernate.criterion.Restrictions; |
24 | 25 |
import org.hibernate.envers.query.AuditEntity; |
... | ... | |
30 | 31 |
|
31 | 32 |
import eu.etaxonomy.cdm.model.common.CdmBase; |
32 | 33 |
import eu.etaxonomy.cdm.model.description.DescriptionBase; |
34 |
import eu.etaxonomy.cdm.model.description.DescriptionElementBase; |
|
33 | 35 |
import eu.etaxonomy.cdm.model.description.IndividualsAssociation; |
34 | 36 |
import eu.etaxonomy.cdm.model.media.Media; |
35 | 37 |
import eu.etaxonomy.cdm.model.molecular.DnaSample; |
... | ... | |
569 | 571 |
} |
570 | 572 |
|
571 | 573 |
@Override |
572 |
public <T extends SpecimenOrObservationBase> List<T> listByAssociatedTaxon(Class<T> type,
|
|
574 |
public <T extends SpecimenOrObservationBase> List<T> listByAssociatedTaxon(Class<T> clazz,
|
|
573 | 575 |
Taxon associatedTaxon, Integer limit, Integer start, List<OrderHint> orderHints, List<String> propertyPaths) { |
574 | 576 |
|
575 | 577 |
Set<SpecimenOrObservationBase> setOfAll = new HashSet<SpecimenOrObservationBase>(); |
576 | 578 |
|
579 |
Criteria criteria = null; |
|
580 |
if(clazz == null) { |
|
581 |
criteria = getSession().createCriteria(type, "specimen"); |
|
582 |
} else { |
|
583 |
criteria = getSession().createCriteria(clazz, "specimen"); |
|
584 |
} |
|
585 |
|
|
586 |
Disjunction determinationOr = Restrictions.disjunction(); |
|
587 |
|
|
577 | 588 |
// A Taxon may be referenced by the DeterminationEvent of the SpecimenOrObservationBase |
578 |
List<SpecimenOrObservationBase> byDetermination = list(type, associatedTaxon, null, 0, null, null); |
|
579 |
setOfAll.addAll(byDetermination); |
|
589 |
Criteria determinationsCriteria = criteria.createCriteria("determinations"); |
|
590 |
|
|
591 |
determinationOr.add(Restrictions.eq("taxon", associatedTaxon)); |
|
580 | 592 |
//check also for synonyms |
581 | 593 |
for (Synonym synonym : associatedTaxon.getSynonyms()) { |
582 |
setOfAll.addAll(list(type, synonym, null, 0, null, null));
|
|
594 |
determinationOr.add(Restrictions.eq("taxon", synonym));
|
|
583 | 595 |
} |
596 |
|
|
584 | 597 |
//check also for name determinations |
585 |
setOfAll.addAll(list(type, associatedTaxon.getName(), null, 0, null, null));
|
|
598 |
determinationOr.add(Restrictions.eq("taxonName", associatedTaxon.getName()));
|
|
586 | 599 |
for (TaxonName synonymName : associatedTaxon.getSynonymNames()) { |
587 |
setOfAll.addAll(list(type, synonymName, null, 0, null, null));
|
|
600 |
determinationOr.add(Restrictions.eq("taxonName", synonymName));
|
|
588 | 601 |
} |
589 | 602 |
|
603 |
determinationsCriteria.add(determinationOr); |
|
590 | 604 |
|
591 |
// The IndividualsAssociation elements in a TaxonDescription contain DerivedUnits |
|
592 |
List<IndividualsAssociation> byIndividualsAssociation = descriptionDao.getDescriptionElementForTaxon( |
|
593 |
associatedTaxon.getUuid(), null, IndividualsAssociation.class, null, 0, null); |
|
594 |
for(IndividualsAssociation individualsAssociation : byIndividualsAssociation){ |
|
595 |
setOfAll.add(individualsAssociation.getAssociatedSpecimenOrObservation()); |
|
605 |
if(limit != null) { |
|
606 |
if(start != null) { |
|
607 |
criteria.setFirstResult(start); |
|
608 |
} else { |
|
609 |
criteria.setFirstResult(0); |
|
610 |
} |
|
611 |
criteria.setMaxResults(limit); |
|
596 | 612 |
} |
597 | 613 |
|
614 |
addOrder(criteria,orderHints); |
|
615 |
|
|
616 |
@SuppressWarnings("unchecked") |
|
617 |
List<SpecimenOrObservationBase> detResults = criteria.list(); |
|
618 |
defaultBeanInitializer.initializeAll(detResults, propertyPaths); |
|
619 |
setOfAll.addAll(detResults); |
|
620 |
|
|
621 |
// The IndividualsAssociation elements in a TaxonDescription contain DerivedUnits |
|
622 |
Criteria descriptionElementCriteria = getSession().createCriteria(DescriptionElementBase.class); |
|
623 |
Criteria inDescriptionCriteria = descriptionElementCriteria.createCriteria("inDescription").add(Restrictions.eqOrIsNull("class", "TaxonDescription")); |
|
624 |
Criteria taxonCriteria = inDescriptionCriteria.createCriteria("taxon"); |
|
625 |
taxonCriteria.add(Restrictions.eq("uuid", associatedTaxon.getUuid())); |
|
626 |
descriptionElementCriteria.setProjection(Projections.property("associatedSpecimenOrObservation")); |
|
627 |
|
|
628 |
|
|
629 |
setOfAll.addAll(descriptionElementCriteria.list()); |
|
630 |
|
|
631 |
|
|
598 | 632 |
// SpecimenTypeDesignations may be associated with the TaxonName. |
599 | 633 |
List<SpecimenTypeDesignation> bySpecimenTypeDesignation = taxonNameDao.getTypeDesignations(associatedTaxon.getName(), |
600 | 634 |
SpecimenTypeDesignation.class, null, null, 0, null); |
... | ... | |
620 | 654 |
" from SpecimenOrObservationBase sob" + |
621 | 655 |
" where sob in (:setOfAll)"; |
622 | 656 |
|
623 |
if(type != null && !type.equals(SpecimenOrObservationBase.class)){
|
|
624 |
queryString += " and sob.class = :type"; |
|
657 |
if(clazz != null && !clazz.equals(SpecimenOrObservationBase.class)){
|
|
658 |
queryString += " and sob.class = :type ";
|
|
625 | 659 |
} |
626 | 660 |
|
627 | 661 |
if(orderHints != null && orderHints.size() > 0){ |
... | ... | |
639 | 673 |
Query query = getSession().createQuery(queryString); |
640 | 674 |
query.setParameterList("setOfAll", setOfAll); |
641 | 675 |
|
642 |
if(type != null && !type.equals(SpecimenOrObservationBase.class)){
|
|
643 |
query.setParameter("type", type.getSimpleName());
|
|
676 |
if(clazz != null && !clazz.equals(SpecimenOrObservationBase.class)){
|
|
677 |
query.setParameter("type", clazz.getSimpleName());
|
|
644 | 678 |
} |
645 | 679 |
|
646 | 680 |
if(limit != null) { |
Also available in: Unified diff
ref #7095 Speed up specimen loading