2 * Copyright (C) 2007 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
6 * The contents of this file are subject to the Mozilla Public License Version 1.1
7 * See LICENSE.TXT at the top of this package for the full license terms.
10 package eu
.etaxonomy
.cdm
.persistence
.dao
.hibernate
.common
;
13 import java
.util
.ArrayList
;
14 import java
.util
.Collection
;
15 import java
.util
.Enumeration
;
16 import java
.util
.List
;
17 import java
.util
.Locale
;
19 import java
.util
.UUID
;
21 import org
.apache
.commons
.lang
.StringUtils
;
22 import org
.apache
.log4j
.Logger
;
23 import org
.hibernate
.Criteria
;
24 import org
.hibernate
.Query
;
25 import org
.hibernate
.Session
;
26 import org
.hibernate
.criterion
.Criterion
;
27 import org
.hibernate
.criterion
.Projections
;
28 import org
.hibernate
.criterion
.Restrictions
;
29 import org
.hibernate
.envers
.query
.AuditEntity
;
30 import org
.hibernate
.envers
.query
.AuditQuery
;
31 import org
.springframework
.stereotype
.Repository
;
33 import eu
.etaxonomy
.cdm
.model
.common
.AnnotationType
;
34 import eu
.etaxonomy
.cdm
.model
.common
.CdmBase
;
35 import eu
.etaxonomy
.cdm
.model
.common
.DefinedTerm
;
36 import eu
.etaxonomy
.cdm
.model
.common
.DefinedTermBase
;
37 import eu
.etaxonomy
.cdm
.model
.common
.ExtensionType
;
38 import eu
.etaxonomy
.cdm
.model
.common
.Language
;
39 import eu
.etaxonomy
.cdm
.model
.common
.MarkerType
;
40 import eu
.etaxonomy
.cdm
.model
.common
.TermType
;
41 import eu
.etaxonomy
.cdm
.model
.description
.MeasurementUnit
;
42 import eu
.etaxonomy
.cdm
.model
.description
.PresenceAbsenceTerm
;
43 import eu
.etaxonomy
.cdm
.model
.description
.State
;
44 import eu
.etaxonomy
.cdm
.model
.description
.StatisticalMeasure
;
45 import eu
.etaxonomy
.cdm
.model
.description
.TextFormat
;
46 import eu
.etaxonomy
.cdm
.model
.location
.Country
;
47 import eu
.etaxonomy
.cdm
.model
.location
.NamedArea
;
48 import eu
.etaxonomy
.cdm
.model
.location
.NamedAreaLevel
;
49 import eu
.etaxonomy
.cdm
.model
.location
.NamedAreaType
;
50 import eu
.etaxonomy
.cdm
.model
.location
.ReferenceSystem
;
51 import eu
.etaxonomy
.cdm
.model
.media
.Media
;
52 import eu
.etaxonomy
.cdm
.model
.media
.RightsType
;
53 import eu
.etaxonomy
.cdm
.model
.name
.HybridRelationshipType
;
54 import eu
.etaxonomy
.cdm
.model
.name
.NameRelationshipType
;
55 import eu
.etaxonomy
.cdm
.model
.name
.NameTypeDesignationStatus
;
56 import eu
.etaxonomy
.cdm
.model
.name
.NomenclaturalStatusType
;
57 import eu
.etaxonomy
.cdm
.model
.name
.Rank
;
58 import eu
.etaxonomy
.cdm
.model
.name
.SpecimenTypeDesignationStatus
;
59 import eu
.etaxonomy
.cdm
.model
.occurrence
.DerivationEventType
;
60 import eu
.etaxonomy
.cdm
.model
.taxon
.SynonymRelationshipType
;
61 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonRelationshipType
;
62 import eu
.etaxonomy
.cdm
.model
.view
.AuditEvent
;
63 import eu
.etaxonomy
.cdm
.persistence
.dao
.common
.IDefinedTermDao
;
64 import eu
.etaxonomy
.cdm
.persistence
.query
.MatchMode
;
65 import eu
.etaxonomy
.cdm
.persistence
.query
.OrderHint
;
68 * @author a.kohlbecker
73 public class DefinedTermDaoImpl
extends IdentifiableDaoBase
<DefinedTermBase
> implements IDefinedTermDao
{
74 private static final Logger logger
= Logger
.getLogger(DefinedTermDaoImpl
.class);
76 public DefinedTermDaoImpl() {
77 super(DefinedTermBase
.class);
78 indexedClasses
= new Class
[25];
79 indexedClasses
[0] = Rank
.class;
80 indexedClasses
[1] = AnnotationType
.class;
81 indexedClasses
[2] = ExtensionType
.class;
82 indexedClasses
[3] = Language
.class;
83 indexedClasses
[4] = MarkerType
.class;
84 indexedClasses
[5] = MeasurementUnit
.class;
85 indexedClasses
[6] = DefinedTerm
.class;
86 indexedClasses
[7] = PresenceAbsenceTerm
.class;
87 indexedClasses
[8] = State
.class;
88 indexedClasses
[9] = StatisticalMeasure
.class;
89 indexedClasses
[10] = TextFormat
.class;
90 indexedClasses
[11] = DerivationEventType
.class;
91 indexedClasses
[12] = NamedArea
.class;
92 indexedClasses
[13] = NamedAreaLevel
.class;
93 indexedClasses
[14] = NamedAreaType
.class;
94 indexedClasses
[15] = ReferenceSystem
.class;
95 indexedClasses
[16] = Country
.class;
96 indexedClasses
[17] = RightsType
.class;
97 indexedClasses
[18] = HybridRelationshipType
.class;
98 indexedClasses
[19] = NameRelationshipType
.class;
99 indexedClasses
[20] = NameTypeDesignationStatus
.class;
100 indexedClasses
[21] = NomenclaturalStatusType
.class;
101 indexedClasses
[22] = SpecimenTypeDesignationStatus
.class;
102 indexedClasses
[23] = SynonymRelationshipType
.class;
103 indexedClasses
[24] = TaxonRelationshipType
.class;
108 * @see eu.etaxonomy.cdm.persistence.dao.common.ITitledDao#findByTitle(java.lang.String)
111 public List
<DefinedTermBase
> findByTitle(String queryString
) {
112 return findByTitle(queryString
, null);
118 * @see eu.etaxonomy.cdm.persistence.dao.common.ITitledDao#findByTitle(java.lang.String, eu.etaxonomy.cdm.model.common.CdmBase)
121 public List
<DefinedTermBase
> findByTitle(String queryString
, CdmBase sessionObject
) {
122 checkNotInPriorView("DefinedTermDaoImpl.findByTitle(String queryString, CdmBase sessionObject)");
123 Session session
= getSession();
124 if ( sessionObject
!= null ) {// FIXME is this needed?
125 session
.update(sessionObject
);
127 Query query
= session
.createQuery("select term from DefinedTermBase term join fetch term.representations representation where representation.label = :label");
128 query
.setParameter("label", queryString
);
134 public List
<DefinedTermBase
> findByTitleAndClass(String queryString
, Class
<DefinedTermBase
> clazz
) {
135 checkNotInPriorView("DefinedTermDaoImpl.findByTitleAndClass(String queryString, Class<DefinedTermBase> clazz)");
136 Session session
= getSession();
137 Criteria crit
= session
.createCriteria(clazz
);
138 crit
.add(Restrictions
.ilike("persistentTitleCache", queryString
));
139 List
<DefinedTermBase
> results
= crit
.list();
144 public List
<DefinedTermBase
> findByTitle(String queryString
, MatchMode matchMode
, int page
, int pagesize
, List
<Criterion
> criteria
) {
145 //FIXME is query parametrised?
146 checkNotInPriorView("DefinedTermDaoImpl.findByTitle(String queryString, ITitledDao.MATCH_MODE matchMode, int page, int pagesize, List<Criterion> criteria)");
147 Criteria crit
= getSession().createCriteria(type
);
148 crit
.add(Restrictions
.ilike("titleCache", matchMode
.queryStringFrom(queryString
)));
149 crit
.setMaxResults(pagesize
);
150 int firstItem
= (page
- 1) * pagesize
+ 1;
151 crit
.setFirstResult(firstItem
);
152 List
<DefinedTermBase
> results
= crit
.list();
158 public Country
getCountryByIso(String iso3166
) {
159 // If iso639 = "" query returns non-unique result. We prevent this here:
160 if (StringUtils
.isBlank(iso3166
)) { return null; }
161 AuditEvent auditEvent
= getAuditEventFromContext();
162 if(auditEvent
.equals(AuditEvent
.CURRENT_VIEW
)) {
163 Query query
= getSession().createQuery("from Country where iso3166_A2 = :isoCode");
164 query
.setParameter("isoCode", iso3166
);
165 return (Country
) query
.uniqueResult();
167 AuditQuery query
= getAuditReader().createQuery().forEntitiesAtRevision(Country
.class,auditEvent
.getRevisionNumber());
168 query
.add(AuditEntity
.property("iso3166_A2").eq(iso3166
));
169 return (Country
) query
.getSingleResult();
174 public <T
extends DefinedTermBase
> List
<T
> getDefinedTermByRepresentationText(String text
, Class
<T
> clazz
) {
175 return getDefinedTermByRepresentationText(text
,clazz
,null,null);
179 public <T
extends DefinedTermBase
> List
<T
> getDefinedTermByRepresentationText(String text
, Class
<T
> clazz
, Integer pageSize
,Integer pageNumber
) {
180 checkNotInPriorView("DefinedTermDaoImpl.getDefinedTermByRepresentationText(String text, Class<T> clazz, Integer pageSize,Integer pageNumber)");
182 Criteria criteria
= null;
184 criteria
= getSession().createCriteria(type
);
186 criteria
= getSession().createCriteria(clazz
);
189 criteria
.createAlias("representations", "r").add(Restrictions
.like("r.text", text
));
191 if(pageSize
!= null) {
192 criteria
.setMaxResults(pageSize
);
193 if(pageNumber
!= null) {
194 criteria
.setFirstResult(pageNumber
* pageSize
);
198 return criteria
.list();
202 public int countDefinedTermByRepresentationText(String text
, Class
<?
extends DefinedTermBase
> clazz
) {
203 checkNotInPriorView("DefinedTermDaoImpl.countDefinedTermByRepresentationText(String text, Class<? extends DefinedTermBase> clazz)");
204 Criteria criteria
= null;
206 criteria
= getSession().createCriteria(type
);
208 criteria
= getSession().createCriteria(clazz
);
211 criteria
.createAlias("representations", "r").add(Restrictions
.like("r.text", text
));
213 criteria
.setProjection(Projections
.rowCount());
215 return ((Number
)criteria
.uniqueResult()).intValue();
219 public <T
extends DefinedTermBase
> List
<T
> getDefinedTermByIdInVocabulary(String label
, UUID vocUuid
, Class
<T
> clazz
, Integer pageSize
, Integer pageNumber
) {
220 checkNotInPriorView("DefinedTermDaoImpl.getDefinedTermByIdInVocabulary(String label, UUID vocUuid, Class<T> clazz, Integer pageSize, Integer pageNumber)");
222 Criteria criteria
= null;
224 criteria
= getSession().createCriteria(type
);
226 criteria
= getSession().createCriteria(clazz
);
229 criteria
.createAlias("vocabulary", "voc").add(Restrictions
.like("voc.uuid", vocUuid
))
230 .add(Restrictions
.like("idInVocabulary", label
, org
.hibernate
.criterion
.MatchMode
.EXACT
));
232 if(pageSize
!= null) {
233 criteria
.setMaxResults(pageSize
);
234 if(pageNumber
!= null) {
235 criteria
.setFirstResult(pageNumber
* pageSize
);
239 List
<T
> result
= criteria
.list();
244 public <T
extends DefinedTermBase
> List
<T
> getDefinedTermByRepresentationAbbrev(String text
, Class
<T
> clazz
, Integer pageSize
,Integer pageNumber
) {
245 checkNotInPriorView("DefinedTermDaoImpl.getDefinedTermByRepresentationAbbrev(String abbrev, Class<T> clazz, Integer pageSize,Integer pageNumber)");
247 Criteria criteria
= null;
249 criteria
= getSession().createCriteria(type
);
251 criteria
= getSession().createCriteria(clazz
);
254 criteria
.createAlias("representations", "r").add(Restrictions
.like("r.abbreviatedLabel", text
));
256 if(pageSize
!= null) {
257 criteria
.setMaxResults(pageSize
);
258 if(pageNumber
!= null) {
259 criteria
.setFirstResult(pageNumber
* pageSize
);
263 return criteria
.list();
267 public int countDefinedTermByRepresentationAbbrev(String text
, Class
<?
extends DefinedTermBase
> clazz
) {
268 checkNotInPriorView("DefinedTermDaoImpl.countDefinedTermByRepresentationAbbrev(String abbrev, Class<? extends DefinedTermBase> clazz)");
269 Criteria criteria
= null;
271 criteria
= getSession().createCriteria(type
);
273 criteria
= getSession().createCriteria(clazz
);
276 criteria
.createAlias("representations", "r").add(Restrictions
.like("r.abbreviatedLabel", text
));
279 criteria
.setProjection(Projections
.rowCount());
281 return ((Number
)criteria
.uniqueResult()).intValue();
285 public Language
getLanguageByIso(String iso639
) {
286 if (iso639
.length() < 2 || iso639
.length() > 3) {
287 logger
.warn("Invalid length " + iso639
.length() + " of ISO code. Length must be 2 or 3.");
290 boolean isIso639_1
= iso639
.length() == 2;
294 queryStr
= "from Language where iso639_1 = :isoCode";
296 queryStr
= "from Language where idInVocabulary = :isoCode and vocabulary.uuid = :vocUuid";
298 AuditEvent auditEvent
= getAuditEventFromContext();
299 if(auditEvent
.equals(AuditEvent
.CURRENT_VIEW
)) {
300 Query query
= getSession().createQuery(queryStr
);
301 query
.setParameter("isoCode", iso639
);
303 query
.setParameter("vocUuid", Language
.uuidLanguageVocabulary
);
305 return (Language
) query
.uniqueResult();
307 AuditQuery query
= getAuditReader().createQuery().forEntitiesAtRevision(Language
.class,auditEvent
.getRevisionNumber());
309 query
.add(AuditEntity
.property("iso639_1").eq(iso639
));
311 query
.add(AuditEntity
.property("iso639_2").eq(iso639
));
312 query
.add(AuditEntity
.property("vocabulary.uuid").eq(Language
.uuidLanguageVocabulary
));
315 return (Language
)query
.getSingleResult();
320 * FIXME this will result in a query per language - could you, given that iso codes
321 * are unique, use from Language where iso639_1 in (:isoCode) or iso639_2 in (:isoCode)
324 public List
<Language
> getLanguagesByIso(List
<String
> iso639List
) {
325 List
<Language
> languages
= new ArrayList
<Language
>(iso639List
.size());
326 for (String iso639
: iso639List
) {
327 languages
.add(getLanguageByIso(iso639
));
333 public List
<Language
> getLanguagesByLocale(Enumeration
<Locale
> locales
) {
334 List
<Language
> languages
= new ArrayList
<Language
>();
335 while(locales
.hasMoreElements()) {
336 Locale locale
= locales
.nextElement();
337 languages
.add(getLanguageByIso(locale
.getLanguage()));
343 public int count(NamedAreaLevel level
, NamedAreaType type
) {
344 AuditEvent auditEvent
= getAuditEventFromContext();
345 if(auditEvent
.equals(AuditEvent
.CURRENT_VIEW
)) {
346 Criteria criteria
= getSession().createCriteria(NamedArea
.class);
349 criteria
.add(Restrictions
.eq("level",level
));
353 criteria
.add(Restrictions
.eq("type", type
));
356 criteria
.setProjection(Projections
.rowCount());
358 return ((Number
)criteria
.uniqueResult()).intValue();
360 AuditQuery query
= getAuditReader().createQuery().forEntitiesAtRevision(NamedArea
.class,auditEvent
.getRevisionNumber());
363 query
.add(AuditEntity
.relatedId("level").eq(level
.getId()));
367 query
.add(AuditEntity
.relatedId("type").eq(type
.getId()));
369 query
.addProjection(AuditEntity
.id().count("id"));
370 return ((Long
)query
.getSingleResult()).intValue();
375 public int countMedia(DefinedTermBase definedTerm
) {
376 checkNotInPriorView("DefinedTermDaoImpl.countMedia(DefinedTermBase definedTerm)");
377 Query query
= getSession().createQuery("select count(media) from DefinedTermBase definedTerm join definedTerm.media media where definedTerm = :definedTerm");
378 query
.setParameter("definedTerm", definedTerm
);
380 return ((Long
)query
.uniqueResult()).intValue();
384 public List
<Media
> getMedia(DefinedTermBase definedTerm
, Integer pageSize
, Integer pageNumber
) {
385 checkNotInPriorView("DefinedTermDaoImpl.getMedia(DefinedTermBase definedTerm, Integer pageSize, Integer pageNumber)");
386 Query query
= getSession().createQuery("select media from DefinedTermBase definedTerm join definedTerm.media media where definedTerm = :definedTerm");
387 query
.setParameter("definedTerm", definedTerm
);
389 if(pageSize
!= null) {
390 query
.setMaxResults(pageSize
);
391 if(pageNumber
!= null) {
392 query
.setFirstResult(pageNumber
* pageSize
);
400 * @see eu.etaxonomy.cdm.persistence.dao.common.IDefinedTermDao#list(eu.etaxonomy.cdm.model.location.NamedAreaLevel, eu.etaxonomy.cdm.model.location.NamedAreaType, java.lang.Integer, java.lang.Integer)
403 public List
<NamedArea
> list(NamedAreaLevel level
, NamedAreaType type
, Integer pageSize
, Integer pageNumber
) {
404 AuditEvent auditEvent
= getAuditEventFromContext();
405 if(auditEvent
.equals(AuditEvent
.CURRENT_VIEW
)) {
406 Criteria criteria
= getSession().createCriteria(NamedArea
.class);
409 criteria
.add(Restrictions
.eq("level",level
));
413 criteria
.add(Restrictions
.eq("type", type
));
416 if(pageSize
!= null) {
417 criteria
.setMaxResults(pageSize
);
418 if(pageNumber
!= null) {
419 criteria
.setFirstResult(pageNumber
* pageSize
);
423 return criteria
.list();
425 AuditQuery query
= getAuditReader().createQuery().forEntitiesAtRevision(NamedArea
.class,auditEvent
.getRevisionNumber());
428 query
.add(AuditEntity
.relatedId("level").eq(level
.getId()));
432 query
.add(AuditEntity
.relatedId("type").eq(type
.getId()));
435 return query
.getResultList();
440 * @see eu.etaxonomy.cdm.persistence.dao.common.IDefinedTermDao#list(eu.etaxonomy.cdm.model.location.NamedAreaLevel, eu.etaxonomy.cdm.model.location.NamedAreaType, java.lang.Integer, java.lang.Integer, java.util.List, java.util.List)
443 public List
<NamedArea
> list(NamedAreaLevel level
, NamedAreaType type
, Integer pageSize
, Integer pageNumber
,
444 List
<OrderHint
> orderHints
, List
<String
> propertyPaths
) {
446 List
<NamedArea
> result
;
448 AuditEvent auditEvent
= getAuditEventFromContext();
449 if (auditEvent
.equals(AuditEvent
.CURRENT_VIEW
)) {
450 Criteria criteria
= getSession().createCriteria(NamedArea
.class);
453 criteria
.add(Restrictions
.eq("level", level
));
456 criteria
.add(Restrictions
.eq("type", type
));
458 if(orderHints
!= null){
459 addOrder(criteria
,orderHints
);
461 if (pageSize
!= null) {
462 criteria
.setMaxResults(pageSize
);
463 if (pageNumber
!= null) {
464 criteria
.setFirstResult(pageNumber
* pageSize
);
468 result
= criteria
.list();
470 AuditQuery query
= getAuditReader().createQuery().forEntitiesAtRevision(NamedArea
.class,
471 auditEvent
.getRevisionNumber());
473 query
.add(AuditEntity
.relatedId("level").eq(level
.getId()));
476 query
.add(AuditEntity
.relatedId("type").eq(type
.getId()));
478 result
= query
.getResultList();
481 defaultBeanInitializer
.initializeAll(result
, propertyPaths
);
488 public <T
extends DefinedTermBase
> int countGeneralizationOf(T kindOf
) {
489 AuditEvent auditEvent
= getAuditEventFromContext();
490 if(auditEvent
.equals(AuditEvent
.CURRENT_VIEW
)) {
491 Query query
= getSession().createQuery("select count(term) from DefinedTermBase term where term.kindOf = :kindOf");
492 query
.setParameter("kindOf", kindOf
);
493 return ((Long
)query
.uniqueResult()).intValue();
495 AuditQuery query
= getAuditReader().createQuery().forEntitiesAtRevision(DefinedTermBase
.class,auditEvent
.getRevisionNumber());
496 query
.add(AuditEntity
.relatedId("kindOf").eq(kindOf
.getId()));
497 query
.addProjection(AuditEntity
.id().count("id"));
498 return ((Long
)query
.getSingleResult()).intValue();
503 public <T
extends DefinedTermBase
> int countIncludes(Collection
<T
> partOf
) {
504 if (partOf
== null || partOf
.isEmpty()){
507 AuditEvent auditEvent
= getAuditEventFromContext();
508 if(auditEvent
.equals(AuditEvent
.CURRENT_VIEW
)) {
509 Query query
= getSession().createQuery("select count(term) from DefinedTermBase term where term.partOf in (:partOf)");
510 query
.setParameterList("partOf", partOf
);
511 return ((Long
)query
.uniqueResult()).intValue();
515 AuditQuery query
= getAuditReader().createQuery().forEntitiesAtRevision(DefinedTermBase
.class,auditEvent
.getRevisionNumber());
516 query
.add(AuditEntity
.relatedId("partOf").eq(t
.getId()));
517 query
.addProjection(AuditEntity
.id().count("id"));
518 count
+= ((Long
)query
.getSingleResult()).intValue();
525 public <T
extends DefinedTermBase
> List
<T
> getGeneralizationOf(T kindOf
, Integer pageSize
, Integer pageNumber
) {
526 AuditEvent auditEvent
= getAuditEventFromContext();
527 if(auditEvent
.equals(AuditEvent
.CURRENT_VIEW
)) {
528 Query query
= getSession().createQuery("select term from DefinedTermBase term where term.kindOf = :kindOf");
529 query
.setParameter("kindOf", kindOf
);
531 if(pageSize
!= null) {
532 query
.setMaxResults(pageSize
);
533 if(pageNumber
!= null) {
534 query
.setFirstResult(pageNumber
* pageSize
);
540 AuditQuery query
= getAuditReader().createQuery().forEntitiesAtRevision(DefinedTermBase
.class,auditEvent
.getRevisionNumber());
541 query
.add(AuditEntity
.relatedId("kindOf").eq(kindOf
.getId()));
543 if(pageSize
!= null) {
544 query
.setMaxResults(pageSize
);
545 if(pageNumber
!= null) {
546 query
.setFirstResult(pageNumber
* pageSize
);
550 return query
.getResultList();
555 public <T
extends DefinedTermBase
> List
<T
> getIncludes(Collection
<T
> partOf
, Integer pageSize
, Integer pageNumber
, List
<String
> propertyPaths
) {
556 if (partOf
== null || partOf
.isEmpty()){
557 return new ArrayList
<T
>();
559 AuditEvent auditEvent
= getAuditEventFromContext();
560 if(auditEvent
.equals(AuditEvent
.CURRENT_VIEW
)) {
561 Query query
= getSession().createQuery("select term from DefinedTermBase term where term.partOf in (:partOf)");
562 query
.setParameterList("partOf", partOf
);
564 if(pageSize
!= null) {
565 query
.setMaxResults(pageSize
);
566 if(pageNumber
!= null) {
567 query
.setFirstResult(pageNumber
* pageSize
);
571 List
<T
> results
= query
.list();
572 defaultBeanInitializer
.initializeAll(results
, propertyPaths
);
575 List
<T
> result
= new ArrayList
<T
>();
577 AuditQuery query
= getAuditReader().createQuery().forEntitiesAtRevision(DefinedTermBase
.class,auditEvent
.getRevisionNumber());
578 query
.add(AuditEntity
.relatedId("partOf").eq(t
.getId()));
579 if(pageSize
!= null) {
580 query
.setMaxResults(pageSize
);
581 if(pageNumber
!= null) {
582 query
.setFirstResult(pageNumber
* pageSize
);
586 result
.addAll(query
.getResultList());
588 defaultBeanInitializer
.initializeAll(result
, propertyPaths
);
594 public <T
extends DefinedTermBase
> int countPartOf(Set
<T
> definedTerms
) {
595 checkNotInPriorView("DefinedTermDaoImpl.countPartOf(Set<T> definedTerms)");
596 Query query
= getSession().createQuery("select count(distinct definedTerm) from DefinedTermBase definedTerm join definedTerm.includes included where included in (:definedTerms)");
597 query
.setParameterList("definedTerms", definedTerms
);
598 return ((Long
)query
.uniqueResult()).intValue();
602 public <T
extends DefinedTermBase
> List
<T
> getPartOf(Set
<T
> definedTerms
, Integer pageSize
, Integer pageNumber
, List
<String
> propertyPaths
) {
603 checkNotInPriorView("DefinedTermDaoImpl.getPartOf(Set<T> definedTerms, Integer pageSize, Integer pageNumber)");
604 Query query
= getSession().createQuery("select distinct definedTerm from DefinedTermBase definedTerm join definedTerm.includes included where included in (:definedTerms)");
605 query
.setParameterList("definedTerms", definedTerms
);
607 if(pageSize
!= null) {
608 query
.setMaxResults(pageSize
);
609 if(pageNumber
!= null) {
610 query
.setFirstResult(pageNumber
* pageSize
);
613 List
<T
> r
= query
.list();
615 * For some weird reason, hibernate returns proxies (extending the superclass), not the actual class on this,
616 * despite querying the damn database and returning the discriminator along with the rest of the object properties!
618 * Probably a bug in hibernate, but we'll manually deproxy for now since the objects are initialized anyway, the
619 * performance implications are small (we're swapping one array of references for another, not hitting the db or
622 List
<T
> results
= new ArrayList
<T
>();
623 if(!definedTerms
.isEmpty()) {
624 Class
<T
> type
= (Class
<T
>)definedTerms
.iterator().next().getClass();
626 results
.add(CdmBase
.deproxy(t
, type
));
628 defaultBeanInitializer
.initializeAll(results
, propertyPaths
);
634 public DefinedTermBase
findByUri(URI uri
) {
635 AuditEvent auditEvent
= getAuditEventFromContext();
636 if(auditEvent
.equals(AuditEvent
.CURRENT_VIEW
)) {
637 Query query
= getSession().createQuery("select term from DefinedTermBase term where term.uri = :uri");
638 query
.setParameter("uri", uri
);
639 return (DefinedTermBase
)query
.uniqueResult();
641 AuditQuery query
= getAuditReader().createQuery().forEntitiesAtRevision(DefinedTermBase
.class,auditEvent
.getRevisionNumber());
642 query
.add(AuditEntity
.property("uri").eq(uri
));
643 return (DefinedTermBase
)query
.getSingleResult();
648 * @see eu.etaxonomy.cdm.persistence.dao.common.IDefinedTermDao#listByTermType(eu.etaxonomy.cdm.model.common.TermType, java.lang.Integer, java.lang.Integer, java.util.List, java.util.List)
651 public List
<DefinedTermBase
<?
>> listByTermType(TermType termType
, Integer limit
, Integer start
,
652 List
<OrderHint
> orderHints
, List
<String
> propertyPaths
) {
653 Query query
= getSession().createQuery("select term from DefinedTermBase term where term.termType = :termType");
654 query
.setParameter("termType", termType
);
656 List result
= query
.list();
658 defaultBeanInitializer
.initializeAll(result
, propertyPaths
);
664 public <TERM
extends DefinedTermBase
> List
<TERM
> listByTermClass(Class
<TERM
> clazz
, Integer limit
, Integer start
, List
<OrderHint
> orderHints
, List
<String
> propertyPaths
) {
665 // checkNotInPriorView("DefinedTermDaoImpl.listByTermClass(Class<TERM> clazz, Integer limit, Integer start, List<OrderHint> orderHints, List<String> propertyPaths)");
667 Query query
= getSession().createQuery("from " + clazz
.getSimpleName());
668 //query.setParameter("DTYPE", );
670 List
<TERM
> result
= query
.list();
672 defaultBeanInitializer
.initializeAll(result
, propertyPaths
);