Spring Data JPA独特标准

时间:2015-05-28 10:32:55

标签: jpa spring-data

我将我的旧项目更新为弹簧数据jpa,所以在我的旧项目中,我正在检查db中的唯一字段值,如下所示

@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;
    }

这段代码工作正常,我怎么能把它转换成Spring Data jpa,

我正在传递这样的值,我有服务和实现

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

在我的控制器中

@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,
    }
}

上面的代码非常好,通过这个我需要在我的genericDAO中使用spring jpa规范,我想在jpaspecification中使用Predicate,请帮我在这里,下面的代码是猜测我认为

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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

履行你的&#34; genericDao&#34;要求,您需要一个类似于您已有的自定义存储库类。然后,使用纯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,其中包含我在第一次玩JPA时创建的2个类。