Example usage for javax.persistence.criteria CriteriaBuilder asc

List of usage examples for javax.persistence.criteria CriteriaBuilder asc

Introduction

In this page you can find the example usage for javax.persistence.criteria CriteriaBuilder asc.

Prototype

Order asc(Expression<?> x);

Source Link

Document

Create an ordering by the ascending value of the expression.

Usage

From source file:org.finra.herd.dao.impl.TagDaoImpl.java

@Override
public List<TagEntity> getTagsByTagTypeEntityAndParentTagCode(TagTypeEntity tagTypeEntity, String parentTagCode,
        Boolean isParentTagNull) {
    // Create the criteria builder and the criteria.
    CriteriaBuilder builder = entityManager.getCriteriaBuilder();
    CriteriaQuery<TagEntity> criteria = builder.createQuery(TagEntity.class);

    // The criteria root is the tag entity.
    Root<TagEntity> tagEntityRoot = criteria.from(TagEntity.class);

    // Get the columns.
    Path<String> displayNameColumn = tagEntityRoot.get(TagEntity_.displayName);

    // Create the standard restrictions (i.e. the standard where clauses).
    List<Predicate> predicates = new ArrayList<>();
    predicates.add(builder.equal(tagEntityRoot.get(TagEntity_.tagType), tagTypeEntity));

    if (StringUtils.isNotBlank(parentTagCode)) {
        // Return all tags that are immediate children of the specified parent tag.
        predicates.add(builder.equal(/*from ww  w  . ja  va 2 s  . c  om*/
                builder.upper(tagEntityRoot.get(TagEntity_.parentTagEntity).get(TagEntity_.tagCode)),
                parentTagCode.toUpperCase()));
    } else if (BooleanUtils.isTrue(isParentTagNull)) {
        // The flag is non-null and true, return all tags with no parents, i.e. root tags.
        predicates.add(builder.isNull(tagEntityRoot.get(TagEntity_.parentTagEntity)));
    } else if (BooleanUtils.isFalse(isParentTagNull)) {
        // The flag is non-null and false, return all tags with parents.
        predicates.add(builder.isNotNull(tagEntityRoot.get(TagEntity_.parentTagEntity)));
    }

    // Add all clauses to the query.
    criteria.select(tagEntityRoot).where(builder.and(predicates.toArray(new Predicate[predicates.size()])))
            .orderBy(builder.asc(displayNameColumn));

    // Run the query to get the results.
    return entityManager.createQuery(criteria).getResultList();
}

From source file:org.medici.bia.dao.image.ImageDAOJpaImpl.java

/**
 * {@inheritDoc}/*from  w w  w.jav  a  2s  .c  o m*/
 */
//@SuppressWarnings("unchecked")
public List<VolumeInsert> findVolumeInserts(Integer volNum, String volLetExt) {
    CriteriaBuilder criteriaBuilder = getEntityManager().getCriteriaBuilder();

    ParameterExpression<Integer> parameterVolNum = criteriaBuilder.parameter(Integer.class, "volNum");
    ParameterExpression<String> parameterVolLeText = StringUtils.isEmpty("volLetExt") ? null
            : criteriaBuilder.parameter(String.class, "volLetExt");

    CriteriaQuery<VolumeInsert> cq = criteriaBuilder.createQuery(VolumeInsert.class);
    Root<Image> root = cq.from(Image.class);

    cq.select(criteriaBuilder.construct(VolumeInsert.class, root.get("volNum"), root.get("volLetExt"),
            root.get("insertNum"), root.get("insertLet"))).distinct(true);
    cq.where(criteriaBuilder.and(criteriaBuilder.equal(root.get("volNum"), parameterVolNum),
            StringUtils.isEmpty(volLetExt) ? criteriaBuilder.isNull(root.get("volLetExt"))
                    : criteriaBuilder.equal(root.get("volLetExt"), parameterVolLeText),
            criteriaBuilder.isNotNull(root.get("insertNum"))));
    cq.orderBy(criteriaBuilder.asc(root.get("insertNum")), criteriaBuilder.asc(root.get("insertLet")));

    /* The above query is equivalent to the following:
     * SELECT DISTINCT volNum, volLetExt, insertNum, insertLet FROM Image
     * WHERE 
     *        volNum = :volNum
     *   AND volLetExt (<nullable> ? 'IS NULL' : ':volLetExt')
     *   AND insertNum IS NOT NULL
     * ORDER BY
     *       insertNum ASC,
     *       insertLet ASC
     */

    TypedQuery<VolumeInsert> tq = getEntityManager().createQuery(cq);
    tq.setParameter("volNum", volNum);
    if (!StringUtils.isEmpty(volLetExt))
        tq.setParameter("volLetExt", volLetExt);

    return tq.getResultList();
}

From source file:org.medici.bia.dao.volume.VolumeDAOJpaImpl.java

/**
 * {@inheritDoc}//from  w  ww  .j av a 2s .  c  o m
 */
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public Page searchVolumes(String text, PaginationFilter paginationFilter) throws PersistenceException {
    // Create criteria objects
    CriteriaBuilder criteriaBuilder = getEntityManager().getCriteriaBuilder();

    Page page = new Page(paginationFilter);

    if (paginationFilter.getTotal() == null) {
        CriteriaQuery<Long> criteriaQueryCount = criteriaBuilder.createQuery(Long.class);
        Root<Volume> rootCount = criteriaQueryCount.from(Volume.class);
        criteriaQueryCount.select(criteriaBuilder.count(rootCount));

        List<Predicate> predicates = new ArrayList<Predicate>();
        predicates.add(
                criteriaBuilder.like((Expression) rootCount.get("serieList").get("title"), "%" + text + "%"));
        predicates.add(criteriaBuilder.like((Expression) rootCount.get("serieList").get("subTitle1"),
                "%" + text + "%"));
        predicates.add(criteriaBuilder.like((Expression) rootCount.get("serieList").get("subTitle2"),
                "%" + text + "%"));
        predicates.add(criteriaBuilder.like((Expression) rootCount.get("orgNotes"), "%" + text + "%"));
        predicates.add(criteriaBuilder.like((Expression) rootCount.get("recips"), "%" + text + "%"));
        predicates.add(criteriaBuilder.like((Expression) rootCount.get("researcher"), "%" + text + "%"));
        predicates.add(criteriaBuilder.like((Expression) rootCount.get("senders"), "%" + text + "%"));

        //If we omiss criteriaBuilder.or every predicate is in conjunction with others  
        criteriaQueryCount.where(criteriaBuilder.or(predicates.toArray(new Predicate[] {})));

        TypedQuery typedQueryCount = getEntityManager().createQuery(criteriaQueryCount);
        page.setTotal(new Long((Long) typedQueryCount.getSingleResult()));
    }

    CriteriaQuery<Volume> criteriaQuery = criteriaBuilder.createQuery(Volume.class);
    Root<Volume> root = criteriaQuery.from(Volume.class);

    //We need to duplicate predicates beacause they are link to Root element
    List<Predicate> predicates = new ArrayList<Predicate>();
    predicates.add(criteriaBuilder.like((Expression) root.get("serieList").get("title"), "%" + text + "%"));
    predicates.add(criteriaBuilder.like((Expression) root.get("serieList").get("subTitle1"), "%" + text + "%"));
    predicates.add(criteriaBuilder.like((Expression) root.get("serieList").get("subTitle2"), "%" + text + "%"));
    predicates.add(criteriaBuilder.like((Expression) root.get("orgNotes"), "%" + text + "%"));
    predicates.add(criteriaBuilder.like((Expression) root.get("recips"), "%" + text + "%"));
    predicates.add(criteriaBuilder.like((Expression) root.get("researcher"), "%" + text + "%"));
    predicates.add(criteriaBuilder.like((Expression) root.get("senders"), "%" + text + "%"));

    //If we omiss criteriaBuilder.or every predicate is in conjunction with others  
    criteriaQuery.where(criteriaBuilder.or(predicates.toArray(new Predicate[] {})));
    criteriaQuery.orderBy(criteriaBuilder.asc(root.get("summaryId")));

    // Set values in predicate's elements  
    TypedQuery<Volume> typedQuery = getEntityManager().createQuery(criteriaQuery);
    typedQuery.setFirstResult(paginationFilter.getFirstRecord());
    typedQuery.setMaxResults(paginationFilter.getLength());
    page.setList(typedQuery.getResultList());

    return page;
}

From source file:org.niord.core.area.AreaService.java

/**
 * Searches for areas matching the given search params
 *
 * @param params the sesarch params//from w  ww .j  av a2 s  .c  om
 * @return the search result
 */
@SuppressWarnings("all")
public List<Area> searchAreas(AreaSearchParams params) {

    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<Area> areaQuery = cb.createQuery(Area.class);

    Root<Area> areaRoot = areaQuery.from(Area.class);

    // Build the predicate
    CriteriaHelper<Area> criteriaHelper = new CriteriaHelper<>(cb, areaQuery);

    // Match the name
    Join<Area, AreaDesc> descs = areaRoot.join("descs", JoinType.LEFT);
    if (params.isExact()) {
        criteriaHelper.equalsIgnoreCase(descs.get("name"), params.getName());
    } else {
        criteriaHelper.like(descs.get("name"), params.getName());
    }

    // Optionally, match the language
    if (StringUtils.isNotBlank(params.getLanguage())) {
        criteriaHelper.equals(descs.get("lang"), params.getLanguage());
    }

    // Optionally, match the parent
    if (params.getParentId() != null) {
        areaRoot.join("parent", JoinType.LEFT);
        Path<Area> parent = areaRoot.get("parent");
        criteriaHelper.equals(parent.get("id"), params.getParentId());
    }

    // Assemple lineage filters from search domain and areas
    Set<String> lineages = new HashSet<>();

    // Optionally, filter by the areas associated with the specified domain
    if (StringUtils.isNotBlank(params.getDomain())) {
        Domain d = domainService.findByDomainId(params.getDomain());
        if (d != null && d.getAreas().size() > 0) {
            d.getAreas().forEach(a -> lineages.add(a.getLineage()));
        }
    }

    // Optionally, filter by area subtrees
    if (params.getAreaIds() != null && !params.getAreaIds().isEmpty()) {
        getAreaDetails(params.getAreaIds()).forEach(a -> lineages.add(a.getLineage()));
    }

    // If defined, apply the area lineage filter
    if (!lineages.isEmpty()) {
        Predicate[] areaMatch = lineages.stream()
                .map(lineage -> cb.like(areaRoot.get("lineage"), lineage + "%")).toArray(Predicate[]::new);
        criteriaHelper.add(cb.or(areaMatch));
    }

    // Optionally, search by type
    if (params.getType() != null) {
        criteriaHelper.add(cb.equal(areaRoot.get("type"), params.getType()));
    }

    // Optionally, require that the area has an associated geometry
    if (params.isGeometry()) {
        criteriaHelper.add(cb.isNotNull(areaRoot.get("geometry")));
    }

    // Optionally, require that the area has an messageSorting type
    if (params.isMessageSorting()) {
        criteriaHelper.add(cb.isNotNull(areaRoot.get("messageSorting")));
    }

    // Unless the "inactive" search flag is set, only include active areas.
    if (!params.isInactive()) {
        criteriaHelper.add(cb.equal(areaRoot.get("active"), true));
    }

    // Compute the sort order
    List<Order> sortOrders = new ArrayList<>();
    if (TREE_SORT_ORDER.equals(params.getSortBy())) {
        Arrays.asList("treeSortOrder", "siblingSortOrder", "id").forEach(field -> {
            if (params.getSortOrder() == PagedSearchParamsVo.SortOrder.ASC) {
                sortOrders.add(cb.asc(areaRoot.get(field)));
            } else {
                sortOrders.add(cb.desc(areaRoot.get(field)));
            }
        });
    }

    // Complete the query
    areaQuery.select(areaRoot).distinct(true).where(criteriaHelper.where()).orderBy(sortOrders);

    // Execute the query and update the search result
    return em.createQuery(areaQuery).setMaxResults(params.getMaxSize()).getResultList();
}

From source file:org.niord.core.chart.ChartService.java

/**
 * Returns the list of active charts intersecting with the given geometry.
 * The resulting charts will be ordered by scale
 * @param geometry the geometry/*from w  ww  .ja v a2  s .co m*/
 * @return the list of active charts intersecting with the given geometry
 */
public List<Chart> getIntersectingCharts(Geometry geometry) {
    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<Chart> chartQuery = cb.createQuery(Chart.class);

    Root<Chart> chartRoot = chartQuery.from(Chart.class);

    // Build the predicate
    CriteriaHelper<Chart> criteriaHelper = new CriteriaHelper<>(cb, chartQuery);

    Predicate geomPredicate = new SpatialIntersectsPredicate(cb, chartRoot.get("geometry"), geometry);
    criteriaHelper.add(geomPredicate);

    // Only search for active charts
    criteriaHelper.add(cb.equal(chartRoot.get("active"), true));

    // Complete the query
    chartQuery.select(chartRoot).distinct(true).where(criteriaHelper.where())
            .orderBy(cb.asc(chartRoot.get("scale")));

    // Execute the query and update the search result
    return em.createQuery(chartQuery).getResultList();
}

From source file:org.niord.core.message.MessageService.java

/**
 * Searches out the ID's of the paged result set of messages defined by the search parameters.
 * Also fills out the total result count of the message search result.
 *
 * @param param the search parameters/*from  w  w  w .  j  a v  a 2  s  . c om*/
 * @param result the search result to update with the total result count
 * @return the paged list of message ID's
 */
@SuppressWarnings("all")
List<Integer> searchPagedMessageIds(MessageSearchParams param, PagedSearchResultVo<Message> result)
        throws Exception {

    CriteriaBuilder builder = em.getCriteriaBuilder();
    CriteriaQuery<Tuple> tupleQuery = builder.createTupleQuery();

    // Select messages
    Root<Message> msgRoot = tupleQuery.from(Message.class);

    // Build the predicates based on the search parameters
    CriteriaHelper<Tuple> criteriaHelper = CriteriaHelper.initWithTupleQuery(em).between(msgRoot.get("updated"),
            param.getUpdatedFrom(), param.getUpdatedTo());

    // Filter by dates
    if (param.getFrom() != null || param.getTo() != null) {
        DateType dateType = param.getDateType() != null ? param.getDateType() : DateType.PUBLISH_DATE;
        Date from = param.getFrom();
        Date to = param.getTo();
        switch (dateType) {
        case PUBLISH_DATE:
            criteriaHelper.overlaps(msgRoot.get("publishDateFrom"), msgRoot.get("publishDateTo"), from, to);
            break;
        case EVENT_DATE:
            criteriaHelper.overlaps(msgRoot.get("eventDateFrom"), msgRoot.get("eventDateTo"), from, to);
            break;
        case CREATED_DATE:
            criteriaHelper.between(msgRoot.get("created"), from, to);
            break;
        case UPDATED_DATE:
            criteriaHelper.between(msgRoot.get("updated"), from, to);
            break;
        case PUBLISH_FROM_DATE:
            criteriaHelper.between(msgRoot.get("publishDateFrom"), from, to);
            break;
        case PUBLISH_TO_DATE:
            criteriaHelper.between(msgRoot.get("publishDateTo"), from, to);
            break;
        }
    }

    // Main types and sub-types
    if (!param.getMainTypes().isEmpty()) {
        criteriaHelper.in(msgRoot.get("mainType"), param.getMainTypes());
    }
    if (!param.getTypes().isEmpty()) {
        criteriaHelper.in(msgRoot.get("type"), param.getTypes());
    }

    // Statuses
    if (!param.getStatuses().isEmpty()) {
        criteriaHelper.in(msgRoot.get("status"), param.getStatuses());
    }

    // Search the Lucene index for free text search
    if (param.requiresLuceneSearch()) {
        List<Long> ids = null;
        try {
            ids = messageLuceneIndex.searchIndex(param.getQuery(), param.getLanguage(), Integer.MAX_VALUE);
        } catch (Exception e) {
            log.warn("Error searching lucene index for query " + param.getQuery());
            ids = Collections.emptyList();
        }
        criteriaHelper.in(msgRoot.get("id"), ids);
    }

    // Message series
    if (!param.getSeriesIds().isEmpty()) {
        criteriaHelper.in(msgRoot.get("messageSeries").get("seriesId"), param.getSeriesIds());
    }

    // Filter by area, join over...
    if (!param.getAreaIds().isEmpty()) {
        Join<Message, Area> areas = msgRoot.join("areas", JoinType.LEFT);
        if (!param.getAreaIds().isEmpty()) {
            Predicate[] areaMatch = param.getAreaIds().stream().map(aid -> areaService.findByAreaId(aid))
                    .filter(Objects::nonNull).map(a -> builder.like(areas.get("lineage"), a.getLineage() + "%"))
                    .toArray(Predicate[]::new);
            criteriaHelper.add(builder.or(areaMatch));
        }
    }

    // Filter on categories
    if (!param.getCategoryIds().isEmpty()) {
        Join<Message, Category> categories = msgRoot.join("categories", JoinType.LEFT);
        Predicate[] categoryMatch = param.getCategoryIds().stream()
                .map(cid -> categoryService.findByCategoryId(cid)).filter(Objects::nonNull)
                .map(c -> builder.like(categories.get("lineage"), c.getLineage() + "%"))
                .toArray(Predicate[]::new);
        criteriaHelper.add(builder.or(categoryMatch));
    }

    // Filter on charts
    if (!param.getChartNumbers().isEmpty()) {
        Join<Message, Chart> charts = msgRoot.join("charts", JoinType.LEFT);
        Predicate[] chartMatch = param.getChartNumbers().stream()
                .map(m -> builder.equal(charts.get("chartNumber"), m)).toArray(Predicate[]::new);
        criteriaHelper.add(builder.or(chartMatch));
    }

    // Geometry
    if (param.getExtent() != null) {
        param.getExtent().setSRID(WGS84_SRID);
        Join<Message, MessagePart> partRoot = msgRoot.join("parts", JoinType.LEFT);
        Join<Message, FeatureCollection> fcRoot = partRoot.join("geometry", JoinType.LEFT);
        Join<FeatureCollection, Feature> fRoot = fcRoot.join("features", JoinType.LEFT);
        Predicate geomPredicate = new SpatialIntersectsPredicate(criteriaHelper.getCriteriaBuilder(),
                fRoot.get("geometry"), param.getExtent());

        if (param.getIncludeNoPos() != null && param.getIncludeNoPos().booleanValue()) {
            // search for message with no geometry in addition to messages within extent
            criteriaHelper.add(builder.or(builder.equal(msgRoot.get("hasGeometry"), false), geomPredicate));
        } else {
            // Only search for messages within extent
            criteriaHelper.add(geomPredicate);
        }
    }

    // Tags
    if (!param.getTags().isEmpty()) {
        Join<Message, MessageTag> tags = msgRoot.join("tags", JoinType.LEFT);
        String[] tagIds = param.getTags().toArray(new String[param.getTags().size()]);
        Predicate[] tagMatch = messageTagService.findTags(tagIds).stream()
                .map(t -> builder.equal(tags.get("id"), t.getId())).toArray(Predicate[]::new);
        criteriaHelper.add(builder.or(tagMatch));
    }

    // User
    if (StringUtils.isNotBlank(param.getUsername())) {
        UserType userType = param.getUserType() == null ? UserType.UPDATED_BY : param.getUserType();
        if (userType == UserType.CREATED_BY || userType == UserType.LAST_UPDATED_BY) {
            String joinCol = userType == UserType.CREATED_BY ? "createdBy" : "lastUpdatedBy";
            Join<Message, User> userRoot = msgRoot.join(joinCol, JoinType.LEFT);
            criteriaHelper.equals(userRoot.get("username"), param.getUsername());
        } else {
            Join<Message, MessageHistory> historyRoot = msgRoot.join("history", JoinType.LEFT);
            Join<MessageHistory, User> userRoot = historyRoot.join("user", JoinType.LEFT);
            criteriaHelper.equals(userRoot.get("username"), param.getUsername());
        }
    }

    // Comments
    if (param.getCommentsType() != null) {
        Join<Message, Comment> comments = msgRoot.join("comments", JoinType.LEFT);
        User user = userService.currentUser();
        Predicate own = user != null ? builder.equal(comments.get("user"), user) : null;
        Predicate exists = builder.isNotNull(comments.get("id"));
        Predicate unack = builder.isNull(comments.get("acknowledgedBy"));

        if (user != null && param.getCommentsType() == OWN) {
            criteriaHelper.add(own);
        } else if (user != null && param.getCommentsType() == OWN_UNACK) {
            criteriaHelper.add(builder.and(own, unack));
        } else if (param.getCommentsType() == ANY_UNACK) {
            criteriaHelper.add(builder.and(exists, unack));
        } else if (param.getCommentsType() == ANY) {
            criteriaHelper.add(exists);
        }
    }

    // Refenced messages
    if (StringUtils.isNotBlank(param.getMessageId())) {
        int levels = param.getReferenceLevels() == null ? 1 : param.getReferenceLevels();
        // NB: This is expensive queries - limit the levels
        levels = Math.max(0, Math.min(5, levels));
        // First, find messages referenced by the message ID
        Set<Integer> referencedIds = findReferencedMessageIds(new HashSet<>(), param.getMessageId(), levels);
        // Next, add messages referencing the message ID
        findReferencingMessageIds(referencedIds, param.getMessageId(), levels);
        criteriaHelper.in(msgRoot.get("id"), referencedIds);
    }

    // Determine the fields to fetch
    Join<Message, Area> areaRoot = null;
    Expression<?> treeSortOrder = null;
    List<Selection<?>> fields = new ArrayList<>();
    fields.add(msgRoot.get("id"));
    if (param.sortByEventDate()) {
        fields.add(msgRoot.get("eventDateFrom"));
        fields.add(msgRoot.get("eventDateTo"));
    } else if (param.sortByPublishDate()) {
        fields.add(msgRoot.get("publishDateFrom"));
        fields.add(msgRoot.get("publishDateTo"));
    } else if (param.sortByFollowUpDate()) {
        fields.add(msgRoot.get("followUpDate"));
    } else if (param.sortById()) {
        fields.add(msgRoot.get("year"));
        fields.add(msgRoot.get("number"));
        fields.add(msgRoot.get("publishDateFrom"));
    } else if (param.sortByArea()) {
        areaRoot = msgRoot.join("area", JoinType.LEFT);
        // General messages (without an associated area) should be sorted last
        treeSortOrder = builder.selectCase().when(builder.isNull(areaRoot.get("treeSortOrder")), 999999)
                .otherwise(areaRoot.get("treeSortOrder"));
        fields.add(treeSortOrder);
        fields.add(msgRoot.get("areaSortOrder"));
        fields.add(msgRoot.get("year"));
        fields.add(msgRoot.get("number"));
    }
    Selection[] f = fields.toArray(new Selection<?>[fields.size()]);

    // Complete the query and fetch the message id's (and fields used for sorting)
    tupleQuery.multiselect(f).distinct(true).where(criteriaHelper.where());

    // Sort the query
    if (param.sortByEventDate()) {
        if (param.getSortOrder() == SortOrder.ASC) {
            tupleQuery.orderBy(builder.asc(msgRoot.get("eventDateFrom")),
                    builder.asc(msgRoot.get("eventDateTo")), builder.asc(msgRoot.get("id")));
        } else {
            tupleQuery.orderBy(builder.desc(msgRoot.get("eventDateFrom")),
                    builder.desc(msgRoot.get("eventDateTo")), builder.desc(msgRoot.get("id")));
        }
    } else if (param.sortByPublishDate()) {
        if (param.getSortOrder() == SortOrder.ASC) {
            tupleQuery.orderBy(builder.asc(msgRoot.get("publishDateFrom")),
                    builder.asc(msgRoot.get("publishDateTo")), builder.asc(msgRoot.get("id")));
        } else {
            tupleQuery.orderBy(builder.desc(msgRoot.get("publishDateFrom")),
                    builder.desc(msgRoot.get("publishDateTo")), builder.desc(msgRoot.get("id")));
        }
    } else if (param.sortByFollowUpDate()) {
        if (param.getSortOrder() == SortOrder.ASC) {
            tupleQuery.orderBy(builder.asc(msgRoot.get("followUpDate")), builder.asc(msgRoot.get("id")));
        } else {
            tupleQuery.orderBy(builder.desc(msgRoot.get("followUpDate")), builder.desc(msgRoot.get("id")));
        }
    } else if (param.sortById()) {
        if (param.getSortOrder() == SortOrder.ASC) {
            tupleQuery.orderBy(builder.asc(msgRoot.get("year")), builder.asc(msgRoot.get("number")),
                    builder.asc(msgRoot.get("publishDateFrom")), builder.asc(msgRoot.get("id")));
        } else {
            tupleQuery.orderBy(builder.desc(msgRoot.get("year")), builder.desc(msgRoot.get("number")),
                    builder.desc(msgRoot.get("publishDateFrom")), builder.desc(msgRoot.get("id")));
        }
    } else if (param.sortByArea()) {
        if (param.getSortOrder() == SortOrder.ASC) {
            tupleQuery.orderBy(builder.asc(treeSortOrder), builder.asc(msgRoot.get("areaSortOrder")),
                    builder.asc(msgRoot.get("year")), builder.asc(msgRoot.get("number")),
                    builder.asc(msgRoot.get("id")));
        } else {
            tupleQuery.orderBy(builder.desc(treeSortOrder), builder.desc(msgRoot.get("areaSortOrder")),
                    builder.desc(msgRoot.get("year")), builder.desc(msgRoot.get("number")),
                    builder.desc(msgRoot.get("id")));
        }
    }

    // Execute the query
    List<Tuple> totalResult = em.createQuery(tupleQuery).getResultList();

    // Register the total result
    result.setTotal(totalResult.size());

    List<Integer> msgIds = totalResult.stream().map(t -> (Integer) t.get(0)).collect(Collectors.toList());

    // Extract and return the paged sub-list
    int startIndex = Math.min(msgIds.size(), param.getPage() * param.getMaxSize());
    int endIndex = Math.min(msgIds.size(), startIndex + param.getMaxSize());
    return msgIds.subList(startIndex, endIndex);
}

From source file:org.niord.core.message.MessageTagService.java

/**
 * Searches for message tags matching the given search parameters
 *
 * @param params the search parameters/*from  ww  w  .  j  av  a2  s  .  c  o  m*/
 * @return the search result
 */
@SuppressWarnings("ResultOfMethodCallIgnored")
public List<MessageTag> searchMessageTags(MessageTagSearchParams params) {
    User user = userService.currentUser();
    Domain domain = domainService.currentDomain();

    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<MessageTag> query = cb.createQuery(MessageTag.class);

    Root<MessageTag> tagRoot = query.from(MessageTag.class);

    // Build the predicate
    CriteriaHelper<MessageTag> criteriaHelper = new CriteriaHelper<>(cb, query);

    // Name filtering
    criteriaHelper.like(tagRoot.get("name"), params.getName());

    // Locked filtering
    criteriaHelper.equals(tagRoot.get("locked"), params.getLocked());

    // Type filtering
    Set<MessageTagType> types = params.getTypes() != null ? params.getTypes() : new HashSet<>();
    if (types.isEmpty()) {
        types.add(PUBLIC);
        types.add(DOMAIN);
        types.add(PRIVATE);
    }
    List<Predicate> typePredicates = new LinkedList<>();
    if (types.contains(PUBLIC)) {
        typePredicates.add(cb.equal(tagRoot.get("type"), MessageTagType.PUBLIC));
    }
    if (types.contains(DOMAIN) && domain != null) {
        Join<MessageTag, Domain> domains = tagRoot.join("domain", JoinType.LEFT);
        typePredicates.add(cb.and(cb.equal(tagRoot.get("type"), MessageTagType.DOMAIN),
                cb.equal(domains.get("id"), domain.getId())));
    }
    if (types.contains(PRIVATE) && user != null) {
        Join<MessageTag, User> users = tagRoot.join("user", JoinType.LEFT);
        typePredicates.add(cb.and(cb.equal(tagRoot.get("type"), MessageTagType.PRIVATE),
                cb.equal(users.get("id"), user.getId())));
    }
    if (types.contains(TEMP)) {
        typePredicates.add(cb.equal(tagRoot.get("type"), MessageTagType.TEMP));
    }
    criteriaHelper.add(cb.or(typePredicates.toArray(new Predicate[typePredicates.size()])));

    // Compute the sorting
    List<Order> sortOrders = new ArrayList<>();
    Order nameAscSortOrder = cb.asc(cb.lower(tagRoot.get("name")));
    if (params.sortByType()) {
        Expression sortBy = tagRoot.get("type");
        sortOrders.add(params.getSortOrder() == DESC ? cb.desc(sortBy) : cb.asc(sortBy));
        sortOrders.add(nameAscSortOrder);
    } else if (params.sortByCreated()) {
        Expression sortBy = tagRoot.get("created");
        sortOrders.add(params.getSortOrder() == DESC ? cb.desc(sortBy) : cb.asc(sortBy));
        sortOrders.add(nameAscSortOrder);
    } else if (params.sortByExpiryDate()) {
        Expression sortBy = tagRoot.get("expiryDate");
        sortOrders.add(params.getSortOrder() == DESC ? cb.desc(sortBy) : cb.asc(sortBy));
        sortOrders.add(nameAscSortOrder);
    } else if (params.sortByMessageCount()) {
        Expression sortBy = tagRoot.get("messageCount");
        sortOrders.add(params.getSortOrder() == DESC ? cb.desc(sortBy) : cb.asc(sortBy));
        sortOrders.add(nameAscSortOrder);
    } else {
        if (StringUtils.isNotBlank(params.getName())) {
            sortOrders.add(cb.asc(cb.locate(cb.lower(tagRoot.get("name")), params.getName().toLowerCase())));
        }
        String name = StringUtils.defaultIfBlank(params.getName(), "");
        Expression sortBy = cb.lower(tagRoot.get("name"));
        sortOrders.add(params.getSortOrder() == DESC ? cb.desc(sortBy) : cb.asc(sortBy));
    }

    // Complete the query
    query.select(tagRoot).distinct(true).where(criteriaHelper.where()).orderBy(sortOrders);

    // Execute the query and update the search result
    return em.createQuery(query).setMaxResults(params.getMaxSize()).getResultList();
}

From source file:org.niord.core.publication.PublicationService.java

/**
 * Searches for a page of publication IDs matching the given search parameters
 * Will also update the search result with the total number of matches
 *
 * @param params the search parameters/*w w  w .j  a va  2 s .  c o m*/
 * @param result the result structure to update with the total number of matches
 * @return a page of publication IDs matching the given search parameters
 */
@SuppressWarnings("all")
public List<Integer> searchPagedPublicationIds(PublicationSearchParams params,
        PagedSearchResultVo<Publication> result) {

    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<Tuple> tupleQuery = cb.createTupleQuery();

    Root<Publication> publicationRoot = tupleQuery.from(Publication.class);

    // Build the predicate
    CriteriaHelper<Tuple> criteriaHelper = CriteriaHelper.initWithTupleQuery(em);

    // Match the main type
    criteriaHelper.equals(publicationRoot.get("mainType"), params.getMainType());

    // Match the file type
    criteriaHelper.equals(publicationRoot.get("type"), params.getType());

    // Match the status
    if (params.getStatuses() != null && !params.getStatuses().isEmpty()) {
        criteriaHelper.in(publicationRoot.get("status"), params.getStatuses());
    }

    // Match the title
    if (StringUtils.isNotBlank(params.getTitle())) {
        Join<Publication, PublicationDesc> descs = publicationRoot.join("descs", JoinType.LEFT);
        criteriaHelper.like(descs.get("title"), params.getTitle());

        // Optionally, match the language
        if (StringUtils.isNotBlank(params.getLanguage())) {
            criteriaHelper.equals(descs.get("lang"), params.getLanguage());
        }
    }

    // Match the category
    Join<Publication, PublicationCategory> typeJoin = publicationRoot.join("category", JoinType.LEFT);
    if (StringUtils.isNotBlank(params.getCategory())) {
        criteriaHelper.equals(typeJoin.get("categoryId"), params.getCategory());
    }

    // Match the publish flag of the category
    if (params.getPublished() != null) {
        criteriaHelper.equals(typeJoin.get("publish"), params.getPublished());
    }

    // Match the domain
    if (StringUtils.isNotBlank(params.getDomain())) {
        Join<Publication, Domain> domainJoin = publicationRoot.join("domain", JoinType.LEFT);
        criteriaHelper.add(cb.or(cb.isNull(publicationRoot.get("domain")),
                cb.equal(domainJoin.get("domainId"), params.getDomain())));
    }

    // Match the message publication category
    criteriaHelper.equals(publicationRoot.get("messagePublication"), params.getMessagePublication());

    // Filter by dates
    if (params.getFrom() != null || params.getTo() != null) {
        Date from = params.getFrom(); //TimeUtils.resetTime(params.getFrom());
        Date to = params.getTo(); //TimeUtils.endOfDay(params.getTo());
        criteriaHelper.overlaps(publicationRoot.get("publishDateFrom"), publicationRoot.get("publishDateTo"),
                from, to);
    }

    // Compute the sort order
    List<Order> sortOrders = new ArrayList<>();
    sortOrders.add(cb.asc(typeJoin.get("priority")));
    sortOrders.add(cb.desc(publicationRoot.get("publishDateFrom")));

    // Select ID field + fields used for sorting
    List<Selection<?>> fields = new ArrayList<>();
    fields.add(publicationRoot.get("id"));
    fields.add(typeJoin.get("priority"));
    fields.add(publicationRoot.get("publishDateFrom"));
    Selection[] f = fields.toArray(new Selection<?>[fields.size()]);

    // Complete the query
    tupleQuery.multiselect(f).distinct(true).where(criteriaHelper.where()).orderBy(sortOrders);

    // Execute the query
    List<Tuple> totalResult = em.createQuery(tupleQuery).getResultList();

    // Register the total result
    result.setTotal(totalResult.size());

    List<Integer> publicationIds = totalResult.stream().map(t -> (Integer) t.get(0))
            .collect(Collectors.toList());

    // Extract and return the paged sub-list
    int startIndex = Math.min(publicationIds.size(), params.getPage() * params.getMaxSize());
    int endIndex = Math.min(publicationIds.size(), startIndex + params.getMaxSize());
    return publicationIds.subList(startIndex, endIndex);
}

From source file:org.patientview.repository.impl.ResultHeadingDaoImpl.java

@Override
public List<ResultHeading> get(int panel, Specialty specialty) {

    CriteriaBuilder builder = getEntityManager().getCriteriaBuilder();
    CriteriaQuery<ResultHeading> criteria = builder.createQuery(ResultHeading.class);
    Root<ResultHeading> root = criteria.from(ResultHeading.class);
    List<Predicate> wherePredicates = new ArrayList<Predicate>();

    wherePredicates.add(builder.equal(root.get(ResultHeading_.panel), panel));
    wherePredicates.add(builder.equal(root.get(ResultHeading_.specialty), specialty));

    buildWhereClause(criteria, wherePredicates);

    criteria.orderBy(builder.asc(root.get(ResultHeading_.panelorder)));

    return getEntityManager().createQuery(criteria).getResultList();
}

From source file:org.reusables.access.AbstractEntityManagerRepository.java

@Override
public List<T> findAll(final String orderByPropertyName) {
    final CriteriaBuilder bld = getEm().getCriteriaBuilder();
    final CriteriaQuery<T> query = bld.createQuery(this.entityClass);
    final Root<T> root = query.from(this.entityClass);
    if (orderByPropertyName != null) {
        query.orderBy(bld.asc(root.get(orderByPropertyName)));
    }/*from w  w  w.j a va2s .c o m*/
    return getEm().createQuery(query).getResultList();
}