Java 如何对MySQL进行动态查询
我用的是SpringMVC,如何对Mysql进行动态查询? 我的控制器中有这样的东西:Java 如何对MySQL进行动态查询,java,mysql,spring-mvc,dynamicquery,dynamic-queries,Java,Mysql,Spring Mvc,Dynamicquery,Dynamic Queries,我用的是SpringMVC,如何对Mysql进行动态查询? 我的控制器中有这样的东西:公共字符串getNewsByDateAndAuthor(Model Model,HttpServletRequest request){} 如何将URL中的所有参数与request.getParameterMap(),以及我的映射一起使用来创建一个动态查询 例如,如果我有3个参数,我想生成一个这样的查询: SELECT * FROM news WHERE parameter = IN(val1, val2...
公共字符串getNewsByDateAndAuthor(Model Model,HttpServletRequest request){}
如何将URL中的所有参数与request.getParameterMap()
,以及我的映射
一起使用来创建一个动态查询
例如,如果我有3个参数,我想生成一个这样的查询:
SELECT * FROM news WHERE parameter = IN(val1, val2...) AND parameter2 = IN(val1, val2...) AND parameter3 = IN(val1, val2...)
或者类似的是,我只有一个参数
从新闻中选择*,其中参数=IN(val1,val2…)
如果有人知道,请告诉我怎么做
我想要一些这样的代码:
public String getQuery(Map<String,List<String>> parameters){
List<String> author = new ArrayList<>();
List<String> startDate = new ArrayList<>();
List<String> endDate = new ArrayList<>();
List<String> categories = new ArrayList<>();
List<String> about = new ArrayList<>();
List<String> soureID = new ArrayList<>();
if (!parameters.get("author").isEmpty())
for (int i = 0; i < parameters.get("author").size(); i++) {
author.add(parameters.get("author").get(i));
}
if (!parameters.get("startDate").isEmpty())
for (int i = 0; i < parameters.get("startDate").size(); i++) {
startDate.add(parameters.get("startDate").get(i));
}
if (!parameters.get("endDate").isEmpty())
for (int i = 0; i < parameters.get("endDate").size(); i++) {
endDate.add(parameters.get("endDate").get(i));
}
if (!parameters.get("categories").isEmpty())
for (int i = 0; i < parameters.get("categories").size(); i++) {
categories.add(parameters.get("categories").get(i));
}
if (!parameters.get("about").isEmpty())
for (int i = 0; i < parameters.get("about").size(); i++) {
about.add(parameters.get("about").get(i));
}
if (!parameters.get("soureID").isEmpty())
for (int i = 0; i < parameters.get("soureID").size(); i++) {
soureID.add(parameters.get("soureID").get(i));
}
StringBuilder queryBuilder = new StringBuilder();
queryBuilder.append("SELECT * FROM news WHERE");
if (!author.isEmpty()) {
String authors = author.toString();
authors.replace(" ", " , ");
queryBuilder.append(" author = IN ( " + authors + " ) AND");
}
if (!startDate.isEmpty()) {
String startDates = startDate.toString();
startDates.replace(" ", " , ");
queryBuilder.append(" author = IN ( " + startDates + " ) AND");
}
if (!endDate.isEmpty()) {
String endDates = endDate.toString();
endDates.replace(" ", " , ");
queryBuilder.append(" author = IN ( " + endDates + " ) AND");
}
if (!categories.isEmpty()) {
String categoriesR = categories.toString();
categoriesR.replace(" ", " , ");
queryBuilder.append(" author = IN ( " + categoriesR + " ) AND");
}
if (!about.isEmpty()) {
String abouts = about.toString();
abouts.replace(" ", " , ");
queryBuilder.append(" author = IN ( " + abouts + " ) AND");
}
if (!soureID.isEmpty()) {
String sourceIDs = soureID.toString();
sourceIDs.replace(" ", " , ");
queryBuilder.append(" author = IN ( " + sourceIDs + " ) AND");
}
queryBuilder.delete(queryBuilder.length() - 3, queryBuilder.length());
String query = queryBuilder.toString();
return query;
}
公共字符串getQuery(映射参数){
列表作者=新建ArrayList();
List startDate=new ArrayList();
List endDate=new ArrayList();
列表类别=新建ArrayList();
List about=new ArrayList();
List soureID=new ArrayList();
如果(!parameters.get(“author”).isEmpty())
for(int i=0;i
您不希望使用这样的方法,也不希望使用字符串concats来创建动态查询。你想用这个
类似于下面的内容
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<News> cq = cb.createQuery(News.class);
Root<News> news = cq.from(News.class);
if (!parameters.get("author").isEmpty()) {
cq.where(cb.in(news.get("author"), parameters.get("author"));
}
TypedQuery<News> query = em.createQuery(cq);
return query.getResultList();
不,您不需要这样的方法,您不需要使用字符串concat来创建动态查询。改用
标准
API.Ehrm no,因为它们都位于java.persistence
包或其子包中。只要包含JPA依赖项,让IDE来解决它就行了。这就是EntityManager
,我假设您在哪里使用JPA(如果没有的话,这种方法是行不通的)。如果您使用的是纯SQL而不是JPA(HQL),那么这种方法将不起作用。但你的问题不清楚,我怎么定义这个?实体管理器;CriteriaBuilder cb=em.getCriteriaBuilder();?
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<News> cq = cb.createQuery(News.class);
Root<News> news = cq.from(News.class);
List<Predicate> predicates = new ArrayList<Predicate>();
if (!parameters.get("author").isEmpty()) {
predicates.add(cb.in(news.get("author"), parameters.get("author")));
}
// Other params here.
cq.where(cb.and(predicates.toArray(new Predicate[predicates.size()]));
TypedQuery<News> query = em.createQuery(cq);
return query.getResultList();