2015-05-28 4 views
2

я обновляю свой старый проект до весны JPA данных, так что в моем старом проекте я проверка уникальный поданное значение в дБ, как нижеSpring Data JPA уникальные критерии

@Override 
    public <K extends AbstractDomainObject> boolean isUnique(Class<K> clazz, Map<String, Object> properties) { 
     StringBuffer stringBuffer = new StringBuffer("select count(obj) from "+ clazz.getSimpleName() +" obj where 1=1"); 
     Iterator<String> iterator = properties.keySet().iterator(); 
     logger.info("EntrySet: " + properties.entrySet()); 
     while(iterator.hasNext()) { 
      String key = iterator.next(); 
      stringBuffer.append(" and "); 
      stringBuffer.append("obj."+key+"='"+properties.get(key)+"'"); 
     } 

     Query query = entityManager.createQuery(stringBuffer.toString()); 
     Long resultCount = (Long) query.getSingleResult(); 
     logger.info("### Result Count for isUnique: " + resultCount); 
     return ((int)(resultCount == null?0:resultCount)) <= 0; 
    } 

этот код работает идеально, как мог я преобразовать это в JPA Spring Data,

я передаю значения, как это у меня есть Sevice и реализация

public class CountryService { 
    public boolean isUnique(Country country, Map<String, Object> params); 
} 

public class CountryServiceImpl{ 
    @Autowire 
    GenericDAO genericDAO; 

    @Override 
    public boolean isUnique(Country country, Map<String, Object> params){ 
     genericDAO.isUnique(country, params); 
    } 
} 

In My Co ntroller

@Controller 
@RequestMappin("/country") 
public class CountryController{ 

    @Autowire 
    CountryService countryService; 

    @ReqeustMapping("/unique") 
    public String checkUnique(@ModelAttribute("country")Country country, ModelMap modelMap, HttpServletRequest request){ 
     Map<String, Object> params = new HashMap<String, Object>(); 
     params.put("code", country.getCode()); 
     params.put("name", country.getName()); 
     countryService.isUnique(Country.class, 
    } 
} 

выше код прекрасно, этим мне нужно использовать спецификации весны JPA в моем genericDAO, я думаю, с помощью предиката в jpaspecification, пожалуйста, помогите мне здесь, ниже код догадки я думаю

CriteriaBuilder builder = entityManager.getCriteriaBuilder(); 
     CriteriaQuery<K> query = builder.createQuery(clazz); 
     Root<K> root = query.from(clazz); 

     return entityManager.createQuery(query.select(root)).getResultList(); 
+0

нужна экспертная оценка здесь plz – pradeep

ответ

1

Чтобы выполнить свой «genericDao» требование, вам потребуется пользовательский класс хранилища, похожий на тот, который вы уже имеете. Тогда, решая это с чистым JPA, вы можете использовать метод, как следующее:

public List<T> findByParameters(String param1, String param2, String value1, String value2) { 
     CriteriaBuilder cb = entityManager.getCriteriaBuilder(); 
     CriteriaQuery<T> criteria = cb.createQuery(getEntityClass()); 
     Root<T> root = criteria.from(getEntityClass()); 
     criteria.select(root); 
     criteria.where(cb.and(cb.equal(root.get(param1), value1), cb.equal(root.get(param2), value2))); 
     return entityManager.createQuery(criteria).getResultList(); 
    } 

Вы все еще должны вызвать этот метод, а затем увидеть, если она возвращает список размера больше 1. Конечно, это можно сделать более динамично. Пожалуйста, см. this pastebin, содержащий 2 класса, которые я создал при первом воспроизведении с JPA.

+0

thx для вашего повтора действительно полезен ваш ответ, спасибо большое, я реализую, как вы предоставляете код pastebin, спасибо – pradeep

1

Следующий будет ваш репозиторий.

public interface CountryRepository extends CrudRepository<Country, Integer> { 
    public List<Country> findByCodeAndName(Integer code,String name); 
} 

Ваш CountryService isUnique() будет иметь следующее.

private boolean isUnique(Integer code,String name) { 
    Iterable<Country> iterable= countryRepository.findByCodeAndName(code,name); 
    return iterable.iterator().hasNext(); 
} 

Если у вас есть какие-либо сомнения, пожалуйста, проверьте SQL сгенерированного и обратитесь ДОКУМЕНТАЦИЯ 2.4.2

Смежные вопросы