Search code examples
javahibernatedaohibernate-criteriaspring-rest

Entities list not retrieved with Hibernate DetachedCriteria with ResultTransformer and projection


when trying to retrieve a list of Entities using spring REST and hibernate i face a problem with transforming data and Projection strategy, even if my list is retrieved from the DAO layer but not returned from my method service of my rest API. I got error 500.

Here is my controller method :

@PostMapping(value = "/Users")
public SearchResult<User> search(@RequestBody SearchCriteria searchCriteria) {
    try {
        return userService.searchPaginatedUsers(searchCriteria);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

For the service implementation :

  @Override
  public SearchResult<User> searchPaginatedUsers(SearchCriteria search) {
    List<User> users;
    SearchResult<User> result = new SearchResult<>();
    try {
        DetachedCriteria criteria = DetachedCriteria.forClass(User.class);

        String login = search.getAttributeByCode("login");
        String firstName = search.getAttributeByCode("firstName");
        String lastName = search.getAttributeByCode("lastName");

        if (StringUtils.isNotBlank(login))
            criteria.add(Restrictions.eq("login", login));
        if (StringUtils.isNotBlank(firstName))
            criteria.add(Restrictions.eq("first_name", firstName));
        if (StringUtils.isNotBlank(lastName))
            criteria.add(Restrictions.eq("last_name", lastName));

        result.setTotalRecords(userDAOService.getCountFromCriteria(criteria));

        if (search.getPageNumber() >= 0 && search.getPageSize() > 0) {
            criteria.setProjection(null);
            criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
            users = userDalService.searchByCriteriaPaginated(criteria, search.getPageNumber(),
                    search.getPageSize());
            result.setResults(users);
        }

    } catch (Exception e) {
        e.printStackTrace();
    }
    return result;
}

As i mentioned when debugging and sending an HTTP request my users list is returned from DOA layer.

any ideas will be welcomed. Thanks.


Solution

  • solved by adding projection listlike this :

                ProjectionList projList = Projections.projectionList();
                projList.add(Projections.property("login"), "login");
                projList.add(Projections.property("first_name"), "first_name");
                projList.add(Projections.property("last_name"), "last_name");
    
    
                criteria.setProjection(Projections.distinct(projList));
                criteria.setResultTransformer(new 
                 AliasToBeanResultTransformer(User.class));