我将我的旧项目更新为弹簧数据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();
答案 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个类。