/*
* (c) Copyright 2005-2012 JAXIO, www.jaxio.com
* Source code generated by Celerio, a Jaxio product
* Want to use Celerio within your company? email us at info@jaxio.com
* Follow us on twitter: @springfuse
* Template pack-backend-sd:src/main/java/project/repository/support/ByPatternSpecifications.p.vm.java
*/
package com.company.demo.repository.support;
import static com.google.common.collect.Iterables.toArray;
import static com.google.common.collect.Lists.newArrayList;
import static javax.persistence.metamodel.Attribute.PersistentAttributeType.MANY_TO_ONE;
import static javax.persistence.metamodel.Attribute.PersistentAttributeType.ONE_TO_ONE;
import static org.apache.commons.lang.StringUtils.isNotEmpty;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import javax.persistence.metamodel.Attribute;
import javax.persistence.metamodel.EntityType;
import javax.persistence.metamodel.SingularAttribute;
import org.springframework.data.jpa.domain.Specification;
public class ByPatternSpecifications {
/**
* Lookup entities having at least one String attribute matching the passed pattern.
*/
public static <T> Specification<T> byPattern(final EntityManager em, final String pattern, final Class<T> type) {
return new Specification<T>() {
@Override
public Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
List<Predicate> predicates = newArrayList();
EntityType<T> entity = em.getMetamodel().entity(type);
for (Attribute<T, ?> attr : entity.getDeclaredSingularAttributes()) {
if (attr.getPersistentAttributeType() == MANY_TO_ONE
|| attr.getPersistentAttributeType() == ONE_TO_ONE) {
continue;
}
if (attr.getJavaType() == String.class && isNotEmpty(pattern)) {
System.out.println(attr.getName() + " " + pattern);
predicates.add(builder.like(root.get(attribute(entity, attr)), pattern(pattern)));
}
}
return predicates.isEmpty() ? builder.conjunction() : builder.or(toArray(predicates, Predicate.class));
}
private SingularAttribute<T, String> attribute(EntityType<T> entity, Attribute<T, ?> attr) {
return entity.getDeclaredSingularAttribute(attr.getName(), String.class);
}
};
}
static private String pattern(String str) {
return "%" + str + "%";
}
}