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.
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));