query 订阅
Query,是查询的意思,为了在数据库中寻找某一特定文件、网站、记录或一系列记录,由搜索引擎或数据库送出的消息。 展开全文
Query,是查询的意思,为了在数据库中寻找某一特定文件、网站、记录或一系列记录,由搜索引擎或数据库送出的消息。
信息
分 类
IP与多媒体
查询命令
query user
中文名
Query
中文译名
查询
Query简介
英文缩写:Query
收起全文
精华内容
参与话题
问答
  • 注明:上篇文章介绍了...条件构造器咱们讲述queryWrapper和updateWrapper的用法、关系、以及强大之处。 首先在这里写下官方文档的链接位置,官方文档说的很详细。如果还想知道在项目中的具体用法请往下看。 ...

    注明:上篇文章介绍了springboot+mybatis-plus通用CRUD的用法,这篇文章我们来介绍一下mybatis-plus强大的条件构造器。mybatis-plus的版本为最新版3.0.3 。条件构造器咱们讲述queryWrapper和updateWrapper的用法、关系、以及强大之处。

    首先在这里写下官方文档的链接位置,官方文档说的很详细。如果还想知道在项目中的具体用法请往下看。

    一、条件构造器关系介绍

    在这里插入图片描述

    介绍 :

    1. 上图绿色框为抽象类abstract
    2. 蓝色框为正常class类,可new对象
    3. 黄色箭头指向为父子类关系,箭头指向为父类

    wapper介绍 :

    1. Wrapper : 条件构造抽象类,最顶端父类,抽象类中提供4个方法西面贴源码展示
    2. AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件
    3. AbstractLambdaWrapper : Lambda 语法使用 Wrapper统一处理解析 lambda 获取 column。
    4. LambdaQueryWrapper :看名称也能明白就是用于Lambda语法使用的查询Wrapper
    5. LambdaUpdateWrapper : Lambda 更新封装Wrapper
    6. QueryWrapper : Entity 对象封装操作类,不是用lambda语法
    7. UpdateWrapper : Update 条件封装,用于Entity对象更新操作

    二、项目实例

    在这里我以QueryWrapper和UpdateWrapper为例,进行测试讲解。我会在上篇博客原有的基础上进行测试,如果不喜欢搭建项目的可直接下载我上个项目,上个项目的博客对应上个项目的讲解
    在这里插入图片描述

    上图表格为条件构造器使用中的各个方法格式和说明,如有不懂可参考官方文档内容

    构造器条件

    package com.lqf.crud;
    
    import com.baomidou.mybatisplus.core.conditions.Wrapper;
    import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
    import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
    import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
    import com.baomidou.mybatisplus.core.metadata.IPage;
    import com.baomidou.mybatisplus.core.toolkit.Constants;
    import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
    import com.lqf.crud.bean.crm.User;
    import com.lqf.crud.dao.crm.UserMapper;
    import com.sun.org.apache.xerces.internal.util.EntityResolverWrapper;
    import org.apache.ibatis.annotations.Param;
    import org.apache.ibatis.session.RowBounds;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
    import org.springframework.web.jsf.el.WebApplicationContextFacesELResolver;
    
    import javax.naming.Name;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class QueryWrapperTests {
    
        @Autowired
        private UserMapper mapper;
    
        /**
         * <p>
         * 根据根据 entity 条件,删除记录,QueryWrapper实体对象封装操作类(可以为 null)
         * 下方获取到queryWrapper后删除的查询条件为name字段为null的and年龄大于等于12的and email字段不为null的
         * 同理写法条件添加的方式就不做过多介绍了。
         * </p>
         */
        @Test
        public void delete() {
            QueryWrapper<User> queryWrapper = new QueryWrapper<>();
            queryWrapper
                    .isNull("name")
                    .ge("age", 12)
                    .isNotNull("email");
            int delete = mapper.delete(queryWrapper);
            System.out.println("delete return count = " + delete);
        }
    
    
        /**
         * <p>
         * 根据 entity 条件,查询一条记录,
         * 这里和上方删除构造条件一样,只是seletOne返回的是一条实体记录,当出现多条时会报错
         * </p>
         */
        @Test
        public void selectOne() {
            QueryWrapper<User> queryWrapper = new QueryWrapper<>();
            queryWrapper.eq("name", "lqf");
    
            User user = mapper.selectOne(queryWrapper);
            System.out.println(user);
        }
    
    
        /**
         * <p>
         * 根据 Wrapper 条件,查询总记录数
         * </p>
         *
         * @param queryWrapper 实体对象
         */
        @Test
        public void selectCount() {
            QueryWrapper<User> queryWrapper = new QueryWrapper<>();
            queryWrapper.eq("name", "lqf");
    
            Integer count = mapper.selectCount(queryWrapper);
            System.out.println(count);
        }
    
    
        /**
         * <p>
         * 根据 entity 条件,查询全部记录
         * </p>
         *
         * @param queryWrapper 实体对象封装操作类(可以为 null)为null查询全部
         */
        @Test
        public void selectList() {
            List<User> list = mapper.selectList(null);
    
            System.out.println(list);
        }
    
        /**
         * <p>
         * 根据 Wrapper 条件,查询全部记录
         * </p>
         *
         * @param queryWrapper 实体对象封装操作类(可以为 null)
         */
        @Test
        public void selectMaps() {
            QueryWrapper<User> queryWrapper = new QueryWrapper<>();
            queryWrapper.isNotNull("name");
            List<Map<String, Object>> maps = mapper.selectMaps(queryWrapper);
            for (Map<String, Object> map : maps) {
                System.out.println(map);
            }
        }
    
        /**
         * 打印结果
         * {name=lqf, id=1046282328366391406, age=12, email=lqf@163.com, status=false}
         * {name=lqf, id=1046282328366391407, age=12, email=lqf@163.com, status=false}
         * {name=lqf, id=1046282328366391408, age=12, email=lqf@163.com, status=false}
         * {name=lqf, id=1046282328366391409, age=12, email=lqf@163.com, status=false}
         * {name=lqf, id=1046282328366391410, age=12, email=lqf@163.com, status=false}
         * {name=lqf, id=1046282328366391411, age=12, email=lqf@163.com, status=false}
         * {name=lqf, id=1046282328366391412, age=12, email=lqf@163.com, status=false}
         * {name=lqf, id=1046282328366391413, age=12, email=lqf@163.com, status=false}
         * {name=lqf, id=1046282328366391414, age=12, email=lqf@163.com, status=false}
         * {name=lqf, id=1046282328366391415, age=12, email=lqf@163.com, status=false}
         * {name=lqf, id=1046282328366391416, age=12, email=lqf@163.com, status=false}
         * {name=lqf, id=1046282328366391417, age=12, email=lqf@163.com, status=false}
         * {name=lqf, id=1046282328366391418, age=12, email=lqf@163.com, status=false}
         * json类型的键值对模式
         */
    
        /**
         * <p>
         * 根据 entity 条件,查询全部记录(并翻页)
         * </p>
         *
         * @param page         分页查询条件(可以为 RowBounds.DEFAULT)
         * @param queryWrapper 实体对象封装操作类(可以为 null)
         */
        @Test
        public void selectPage() {
            Page<User> page = new Page<>(1, 5);
            QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    
            IPage<User> userIPage = mapper.selectPage(page, queryWrapper);
            System.out.println(userIPage);
        }
    
        /**
         * 打印结果
         * ==>  Preparing: SELECT COUNT(1) FROM user
         * ==> Parameters:
         * <==    Columns: COUNT(1)
         * <==        Row: 100
         * ==>  Preparing: SELECT id,name,age,email,status FROM user LIMIT 0,5
         * ==> Parameters:
         * <==    Columns: id, name, age, email, status
         * <==        Row: 1046282328366391319, lqf, 12, lqf@163.com, 0
         * <==        Row: 1046282328366391320, lqf, 12, lqf@163.com, 0
         * <==        Row: 1046282328366391321, lqf, 12, lqf@163.com, 0
         * <==        Row: 1046282328366391322, lqf, 12, lqf@163.com, 0
         * <==        Row: 1046282328366391323, lqf, 12, lqf@163.com, 0
         * <==      Total: 5
         *
         *
         * 这里需要在项目中加入分页插件
         *   @Bean
         *     public PaginationInterceptor paginationInterceptor() {
         *         return new PaginationInterceptor();
         *     }
         */
    
    
        /**
         * <p>
         * 根据 Wrapper 条件,查询全部记录(并翻页)
         * </p>
         *
         * @param page         分页查询条件
         * @param queryWrapper 实体对象封装操作类
         */
        @Test
        public void selectMapsPage() {
            Page<User> page = new Page<>(1, 5);
            QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    
            IPage<Map<String, Object>> mapIPage = mapper.selectMapsPage(page, queryWrapper);
            System.out.println(mapIPage);
        }
    
        /**
         * 和上个分页同理只是返回类型不同
         */
    
    
        /**
         * <p>
         * 根据 whereEntity 条件,更新记录
         * </p>
         *
         * @param entity        实体对象 (set 条件值,不能为 null)
         * @param updateWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句)
         */
        @Test
        public void update() {
    
            //修改值
            User user = new User();
            user.setStatus(true);
            user.setName("zhangsan");
    
            //修改条件s
            UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();
            userUpdateWrapper.eq("name", "lqf");
    
            int update = mapper.update(user, userUpdateWrapper);
    
            System.out.println(update);
        }
    
        /**
         * 打印结果
         * ==>  Preparing: UPDATE user SET name=?, status=? WHERE name = ?
         * ==> Parameters: zhangsan(String), true(Boolean), lqf(String)
         * <==    Updates: 100
         * Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@56a4f272]
         * 100
         * 2018-10-02 15:08:03.928  INFO 7972 --- [       Thread-2] o.s.w.c.s.GenericWebApplicationContext   : Closing org.springframework.web.context.support.GenericWebApplicationContext@37313c65: startup date [Tue Oct 02 15:08:00 CST 2018]; root of context hierarchy
         * 2018-10-02 15:08:03.937  INFO 7972 --- [       Thread-2] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown initiated...
         * 2018-10-02 15:08:04.053  INFO 7972 --- [       Thread-2] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown completed.
         *
         * Process finished with exit code 0
         */
    
    }
    
    

    上方代码对通过构造器条件进行的查询、删除、修改进行是演示,构造器方法没有做过多演示,但是所有的构造器方法同理使用,如果还有不会用的点开看官方文档查看并按照上方例子使用即可。

    源码下载地址

    上一篇 :(四) springboot + mybatis plus详细拆解CRUD
    下一篇 : (六)springboot + mybatis plus实现多表联查分页3.X版本

    展开全文
  • 在DAO的方法之上加了注解@Query、@Modifying,但是在运行过程中一直抛出 javax.persistence.TransactionRequiredException: Executing an update/delete query 的异常,实在无力了,希望有大大来帮助 2015-04-29 ...
  • mybatis-plus QueryWrapper自定义查询条件

    万次阅读 热门讨论 2019-08-16 10:53:45
    mybatis-plus框架功能很强大,把很多功能都集成了,比如自动生成代码结构,mybatis crud封装,分页,动态数据源等等,附上官网链接https://mp.baomidou.com/,github上有代码例子,国内小伙伴推荐码云...

    mybatis-plus框架功能很强大,把很多功能都集成了,比如自动生成代码结构,mybatis crud封装,分页,动态数据源等等,附上官网链接https://mp.baomidou.com/,github上有代码例子,国内小伙伴推荐码云https://gitee.com/baomidou/mybatis-plus。
    但是,其中还是有些小坑,文档也没有涉及的很全面,碰到问题,百度或者发issue,能力强的还是直接看源码好,一切答案都在源码中

    版本推荐用3.1.0,3.1.1及以上版本有bug,访问mapper接口的时候,会把数据库date类型转换为localDateTime,报错java.sql.SQLFeatureNotSupportedException
    解决方案可以参考 https://blog.csdn.net/lkh1992/article/details/90024829

    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.1.0</version>
    </dependency>
    


    mybatis-plus里有个类QueryWrapper,封装sql对象,包括where条件,order by排序,select哪些字段等等。该类的具体用法,网上教程很多。
    这里有个需求,通过前端提交查询条件,后台动态拼接成where的sql语句,用于查询。常规做法是前端提交一堆查询参数,controller层用一个对象接收,然后在mybatis的xml里对该对象里的各种属性做判断

    <select id="test">
    	select * from test
    	<where>
    		<if test=" name != null and name != '' ">
    			and name=#{name}
    		</if>
    		...
    	</where>
    </select>
    

    这有个问题是具体字段连接类型就有很多,like,=,>,<等等。当然要实现功能有很多种方式,mybatis-plus的QueryWrapper很强大,可以通过对象的方式进行查询操作,但是不同的页面都自己管自己,效率低下,会存在大量重复代码。所以我就想自己封装一套,从前端的查询条件传固定格式的参数,到后台进行转换,自动拼接成对应的where sql语句,再传到mybatis xml里进行动态查询。这样所有页面就可以统一,便于操作。下面进入正题:

    前端

    前端用的技术是html+jquery,jquery操作dom做各种操作。html就仅仅是样式展现,不涉及任何的逻辑代码,没有使用vue之类的mvvm框架,也没有使用thymeleaf之类的模板引擎,其实这些都会在html嵌入污染代码,导致美工修改页面样式的时候一脸蒙蔽。html就是纯的html+css,通过jquery来完成剩余的工作。
    index.html

    <form id="myform">
    	<input name="name"/>
    	<input name="age"/>
    	<input name="startdate"/>
    	<input name="enddate"/>
    </form>
    

    jquery发起post请求,拼接的参数如下:

    var searchParam = [
    	{column: "COLUMN_NAME",type: "like", value: "tim"},
    	{column: "COLUMN_AGE",type: "eq", value: "22"},
    	{column: "COLUMN_DATE",type: "ge", value: "2019-08-16 00:00:00"},
    	{column: "COLUMN_DATE",type: "le", value: "2019-08-16 23:59:59"}
    ];
    

    其中column值 为数据表的字段名;type值为sql字段拼接的方式,规则可自己定制;value就是字段值了;目标拼接成的sql语句如下:
    COLUMN_NAME like '%tim%' and COLUMN_AGE=22 and COLUMN_DATE>='2019-08-16 00:00:00' and COLUMN_DATE<='2019-08-16 23:59:59'
    jquery发起post请求:

    $.ajax({
    	url: "list",
    	type: "post",
    	data: {pageNum:1,pageSize:20,condition:JSON.stringify(searchParam),...(根据需要自己加请求参数)}
    	success: function(result){...}
    });
    

    说明:请求参数condition为什么要传json字符串后续有介绍。

    后端

    Controller

    controller接收前端发过来的参数,碰到一个问题,在有多个请求参数的情况下,如何接收 集合对象 请求参数?使用了很多方法都不行,后续有空再研究下,目前使用的方法简单粗暴,就上传json字符串,后端转换成对象。
    Controller:

    import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
    @RequestMapping(value = "/list", method = RequestMethod.POST)
    public Object getTestList(@RequestParam(name = "pageNum", required = false, defaultValue = "1") int pageNum,
                              @RequestParam(name = "pageSize", required = false, defaultValue = "15") int pageSize,
                              @RequestParam(name = "condition",required = false) String conditionJson) {
    	 QueryWrapper queryWrapper = SearchUtil.parseWhereSql(conditionJson);
         queryWrapper.orderByDesc("CREATE_DATE");
         return service.getPageTestList(queryWrapper,pageNum,pageSize);
    }
    

    SearchUtil:

    public static QueryWrapper parseWhereSql(String conditionJson){
        QueryWrapper queryWrapper = new QueryWrapper();
        if(StrUtil.isNotEmpty(conditionJson)){
            List<ConditionVo> conditionList = JSON.parseArray(conditionJson,ConditionVo.class);
            if(CollUtil.isNotEmpty(conditionList)){
                for(ConditionVo conditionVo : conditionList){
                    switch (conditionVo.getType()){
                        case "eq": queryWrapper.eq(conditionVo.getColumn(),conditionVo.getValue());break;
                        case "ne": queryWrapper.ne(conditionVo.getColumn(),conditionVo.getValue());break;
                        case "like": queryWrapper.like(conditionVo.getColumn(),conditionVo.getValue());break;
                        case "leftlike": queryWrapper.likeLeft(conditionVo.getColumn(),conditionVo.getValue());break;
                        case "rightlike": queryWrapper.likeRight(conditionVo.getColumn(),conditionVo.getValue());break;
                        case "notlike": queryWrapper.notLike(conditionVo.getColumn(),conditionVo.getValue());break;
                        case "gt": queryWrapper.gt(conditionVo.getColumn(),conditionVo.getValue());break;
                        case "lt": queryWrapper.lt(conditionVo.getColumn(),conditionVo.getValue());break;
                        case "ge": queryWrapper.ge(conditionVo.getColumn(),conditionVo.getValue());break;
                        case "le": queryWrapper.le(conditionVo.getColumn(),conditionVo.getValue());break;
                    }
                }
            }
        }
        return queryWrapper;
    }
    

    该类是重点,根据type不同的值进行组合,queryWrapper包含了很多拼接方法,可以看文档。这里只写了一些常用的拼接方法。
    ConditionVo:

    @Data
    public class ConditionVo implements Serializable {
        private static final long serialVersionUID = -5099378457111419832L;
        /**
         * 数据库字段名
         */
        private String column;
        /**
         * 字段值
         */
        private String value;
        /**
         * 连接类型,如llike,equals,gt,ge,lt,le
         */
        private String type;
    }
    

    拿到queryWrapper对象就是重点了,之后就是sql操作了。

    Service

    import com.baomidou.mybatisplus.core.metadata.IPage;
    import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
    @Override
    public IPage<ListVo> getPageEntityList(QueryWrapper queryWrapper, int pageNum, int pageSize) {
         Page<ListVo> page = new Page<>(pageNum,pageSize);
         IPage<ListVo> list = page(page,queryWrapper);
         return list;
     }
    @Override
    public IPage<ListVo> getPageTestList(QueryWrapper queryWrapper, int pageNum, int pageSize) {
        Page<ListVo> page = new Page<>(pageNum,pageSize);
        IPage<ListVo> list = mapper.getPageTestList(page,queryWrapper);
        return list;
    }
    

    上面的第一个方法getPageEntityList使用的是mybatis-plus自带的page(page,queryWrapper)方法,具体使用方法可以查看官方文档。使用该方法就不需要自己写sql语句了。本篇文章重点是下面那个方法getPageTestList
    mybatis-plus自带了强大的翻页功能,只需往mapper方法里传入一个Page类,该类实现了IPage接口。
    这里有个坑,通过看源码发现,mapper方法的参数有顺序要求:page对象一定要放在第一个参数,否则翻页查询会报错。源码在com.baomidou.mybatisplus.core.override.MybatisMapperMethodpublic Object execute(SqlSession sqlSession, Object[] args)方法的case SELECT判断里,因反编译后的行数可能不同,所以贴上具体是哪个方法,我这边反编译后在68行
    ListVo是自己的业务对象。

    Mapper

    import com.baomidou.mybatisplus.core.toolkit.Constants;
    IPage<ListVo> getPageTestList(Page<ListVo> page,@Param(Constants.WRAPPER) Wrapper query);
    

    大家可以进Constans这个接口看下源码都有哪些值,后续xml要用到。

    XML

    <select id="getPageTestList" resultType="xx.xx.xx.ListVo">
        select * from test
        <if test="ew.emptyOfWhere == false">
           ${ew.customSqlSegment}
        </if>
    </select>
    

    这里先强调一点,${ew.customSqlSegment}是用美元符号$,而不是#
    这里的ew是啥?其实就是mapper方法里的@Param(Constants.WRAPPER) Wrapper query对象,Constants.WRAPPER的值就是ew
    首先判断ew.emptyOfWhere是否存在where条件,有的话再拼接上去。ew里还有个属性nonEmptyOfWhere,看单词应该跟emptyOfWhere的值相反,但是在xml中使用却提示不存在,不知道为什么,又是一个地雷?
    ew.customSqlSegment又是啥,该值是WHERE + sql语句,还有个ew.sqlSegment是不包括WHERE字符串。大家可以在service层输出queryWrapper里面的相关方法:

    log.info(queryWrapper.isEmptyOfWhere()+"");
    log.info(queryWrapper.getCustomSqlSegment());
    log.info(queryWrapper.getSqlSegment());
    log.info(queryWrapper.getParamNameValuePairs().toString());
    

    输出如下:

    getCustomSqlSegment()
    WHERE COLUMN_NAME LIKE #{ew.paramNameValuePairs.MPGENVAL1}
    getSqlSegment()
    COLUMN_NAME LIKE #{ew.paramNameValuePairs.MPGENVAL1}
    getParamNameValuePairs()
    {MPGENVAL1=%tim%}

    看到这,mybatis框架用的熟练的小伙伴们应该就懂了吧,这样就可以避免sql注入的问题。
    这里又有 一个小坑,就是order by排序。传入了page参数,mybatis-plus底层就会帮你翻页查询,会查询总数量。通过输出的sql日志可以发现,其实框架是在你的sql基础上外面再套一层select count(1) from。这里会有个问题,本人用的数据库是sqlserver,如果在count查询语句里用了order by就会出错,解决方法是调用queryWrapper对象中的排序方法,如:queryWrapper.orderByDesc("CREATE_DATE"),xml中就不要用order by。所以我在controller层用了这个方法,这样mybatis-plus底层会合理地进行查询。

    总结

    通过上面这种封装方式,就不需要在xml里面做一大堆的where条件if判断来拼接sql。
    mybatis-plus框架功能很强大,且还在维护中,有空可以仔细阅读下文档、官方例子,能力强的可以直接看源码,一切答案都在源码中

    展开全文
  • QueryRunner qr = new QueryRunner(C3P0Util.getDataSource()); List<UnitCN> list = qr.query("select unit,cap_score from t_risk_unit_cn " + "where t_time between to_date('2017-11-8 18:00:00','yyyy...
  • at org.apache.commons.dbutils.QueryRunner.query(QueryRunner.java:349) at org.apache.commons.dbutils.QueryRunner.query(QueryRunner.java:305) at com.cciot.dao.Impl.UserDaoImpl.findAllUser(UserDaoImpl...
  • 基本查询(Query查询中文)

    万次阅读 2020-03-17 22:22:49
    查询语句: ... "query": { "term": {"interests":"唱歌"} } } #terms:查询某个字段里含有多个关键词的文档 GET /lib4/user/_search { "query":{ "terms":{ "interests": ["喝酒","唱歌"] } ...

     

    查询语句: 

    GET /lib4/user/_search
    {
      "query": {
        "term": {"interests":"唱歌"}
      }
    }
    
    #terms:查询某个字段里含有多个关键词的文档
    GET /lib4/user/_search 
    {
      "query":{
        "terms":{
          "interests": ["喝酒","唱歌"]
        }
      }
    }

     数据准备:

    #2.7.1数据准备
    PUT /lib4
    { 
      "settings":{
        "number_of_shards" : 3, 
        "number_of_replicas" :0
      },
      "mappings":{
        "user":{
          "properties":{
              "name": {"type":"text","analyzer":"ik_max_word"}, 
              "address": {"type":"text","analyzer": "ik_max_word"},
              "age": {"type" :"integer"},
              "interests": {"type":"text","analyzer": "ik_max_word"},
              "birthday": {"type":"date"}
            }
          }
        }
    }
        
        

     

    #ik芾有两个分词器
    #ik_max_word :会将文本做最细粒度的拆分;尽可能多的拆分出词语
    #ik_smart:会做最粗粒度的斥分;已被分出的词语将不会再次被其它词语占有
    #2.7.2 term查询和terms查询
    #term query会去倒排索引中寻找确切的term,它并不知道分词器的存在。
    #这种查询适合keyword、numeric、date.
    #term:查询某个字段里含有某个关键词的文档
    

    添加5个文档: 

    
    PUT /lib4/user/1
    {
      "name" : "赵六",
      "address" : "黑龙江省 铁岭",
      "age" : 50,
      "birthday" : "1970-12-12",
      "interests": "喜欢喝酒,锻炼,说相声"
    }
    
    PUT /lib4/user/2
    {
      "name" :"赵明",
      "address" :"北京海淀区清河",
      "age" : 20,
      "birthday" : "1998-10-12" ,
      "interests": "喜欢喝酒,锻炼,唱歌"
    }
    
    
    PUT /lib4/user/3
    {
      "name" : "lisi",
      "address" :"北京海淀区清河",
      "age" : 23,
      "birthday" : "1998-10-12",
      "interests": "喜欢喝酒,锻炼,唱歌"
    }
    
    
    PUT /lib4/user/4
    {
      "name" :"王五",
      "address" : " 北京海淀区清河",
      "age" : 26,
      "birthday" : "1995-10-12",
      "interests": "喜欢编程,听音乐,旅游"
    }
    
    PUT /lib4/user/5
    {
      "name" : "张三",
      "address" :"北京海淀区清河",
      "age" : 29,
      "birthday" : "1988-10-12",
      "interests": "喜欢摄影,听音乐,跳舞"
    }
    

    term和terms查询 

    term是代表完全匹配,即不进行分词器分析,文档中必须包含整个搜索的词汇

    #term和terms查询
    #查询字段中含有赵的
    GET /lib4/user/_search
    {
      "query": {
        "term": {"name":"赵"}
      }
    }
    
    #指定多个关键字,只要包含其中一个就会被查询出来
    GET /lib4/user/_search
    {
      "query":{
        "terms":{
          "interests": ["喝酒","唱歌"]
        }
      }
    }
    
    #控制返回的数据条数  取前2条
    GET /lib4/user/_search
    {
      "from":0,
      "size": 2, 
      "query":{
        "terms":{
          "interests": ["喝酒","唱歌"]
        }
      }
    }
    
    #版本号的返回
    GET /lib4/user/_search
    {
      "version":true,
      "query":{
        "terms":{
          "interests": [" 喝酒", "唱歌"]
        }
      }
    }
    

    match查询  match是知道分词器存在的这个之前就讲过

    赵六会被分词为两个词  含有赵和六的都会被查询出来

    #match查询
    GET /lib4/user/_search
    {
      "query":{
        "match":{"name": "赵六"}
      }
    }
    

    然后对于数字型的是不会被分词的比如查询年龄20的  这个不会被分成2和0  所以查询结果会去从文档匹配年龄为20的信息

    GET /lib4/user/_search
    {
      "query":{
        "match":{"age": 20}
      }
    }
    
    
    GET /lib4/user/_search
    {
      "query": {
        "match_all": {}
      }
    }

     

    #multi_match指定多个字段关键字匹配  ;match_phrase短语精确匹配 ;_source指定查询结果返回的字段信息

    #指定多个字段匹配
    GET /lib4/user/_search
    {
      "query":{
        "multi_match": {
          "query": "唱歌",
          "fields": ["interests", "name"]
        }
      }
    }
    
    #短语匹配
    GET lib4/user/_search
    {
      "query":{
        "match_phrase" :{"interests": "锻炼,说相声"}
      }
    }
    
    #返回指定的字段
    GET /lib4/user/_search
    {
      "_source": ["address" , "name"],
      "query": {
        "match": {"interests": "唱歌"}
      }
    }

     

     

     

     

    展开全文
  • Query query =session.createSQLQuery(hql); //进行到这步就开始出错了 query.setString("bookNo", bookNo); List<Book> books = query.list(); HibernateSessionFactory.closeSession(); if(books.size()>0){ ...
  • https://www.elastic.co/guide/en/elasticsearch/reference/5.2/docs-delete-by-query.html 之前在 2.X版本里 这个Delete By Query功能被去掉了,因为官方认为会引发一些错误,如需使用 ...

    参考:https://blog.csdn.net/wwd0501/article/details/78812873
    https://www.elastic.co/guide/en/elasticsearch/reference/5.2/docs-delete-by-query.html

    之前在 2.X版本里 这个Delete By Query功能被去掉了,因为官方认为会引发一些错误,如需使用 ,需要自己安装插件。

    安装

    bin/plugin install delete-by-query
    

    使用

    DELETE /索引名/需要清空的type/_query
        {
            "query": {
            "match_all": {}
        }
    }
    

    在5.x版本中 这个api又被官方重新加回自带功能。

    Delete-by-query 和 Update-by-query 重新回到 core ,以前是插件,现在可以直接使用了,
    也是构建在 Reindex 机制之上。
    (es1.x版本是直接支持,在es2.x中提取为插件,5.x继续回归直接支持)

    使用

    POST indexName/_delete_by_query
    {
      "query": { 
        "match_all": {
        }
      }
    }
    

    有时候因为数据量较大删除到一半就返回结果了,不要慌,继续发送命令,多执行几次就好了。

    之后删除索引

    DELETE /indexName
    
    展开全文
  • QueryRunner中query方法

    万次阅读 2018-07-17 11:42:07
    commons.dbutils.QueryRunner query方法中RequestSetHandler 参数对应的返回类型: AbstractListHandler -- 返回多行List的抽象类 ArrayHandler -- 返回一行的Object[] ArrayListHandler -- 返回List,每行是...
  • 正在学习用qt做一个qq的登陆界面,遇到了下面这个问题,我在数据库中只存了两个id,但是当我输入错误的id的时候,query.prepare返回值用debug打出依然是true,是哪里出了问题吗,还有就是数据库表只能创建一次吗,我...
  • "Status": "query end", "Duration": "1.751142", "CPU_user": "0.008999", "CPU_system": "0.003999", "Context_voluntary": "98", "Context_involuntary": "0", "Block_ops_in": "8", "Block_ops_out": ...
  • 我在使用hibernate进行对mysql的数据进行分页查询的时候,用到执行到query.setMaxResults()的时候,报错误 ![图片说明](https://img-ask.csdn.net/upload/201712/15/1513271834_696847.png) 报错: Hibernate: ...
  • @Query(value = "select * from mmall_product m where m.status =1 and m.name like CONCAT('%',?1,'%') and m.category_id in (?2)", nativeQuery = true) List findByNameAndCategoryIds(String productName, ...
  • QueryWrapper用法

    万次阅读 2020-04-29 17:14:09
    QueryWrapper用法1: public IPage initAppEvaluateInfoBaseInfoIdVO(String elderId){ List evaluateInfoBaseInfoIdVOList = new ArrayList(); QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.eq...
  • 各位大神,我租用的一个服务器,使用ananconda,在安装GEOquery包时出错,求大神支招(曾经安装好并使用过了的,但是重启后就失效了。) > source("http://bioconductor.org/biocLite.R") Bioconductor version 3.6 ...
  • Ad hoc query

    千次阅读 2016-07-19 17:57:37
     即席查询(Ad Hoc)是用户根据自己的需求,灵活的选择查询条件,系统能够根据用户的选择生成相应的统计报表。即席查询与普通应用查询最大的不同是普通的应用查询是定制开发的,而即席查询是由用户自定义查询...
  • 3.QueryRunner qr = new QueryRunner(); 你们好,我诚恳的想问几个问题: 第一 :上面这三个有什么使用和定义上的区别(详细点). 第二 :我在项目里面用的 QueryRunner qr = new TxQueryRunner(); 但是老提示错误,后面我...
  • 1、@Transient@Transient表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性;如果一个属性并非数据库表的字段映射,就务必将其标示为@Transient,否则ORM框架默认其注解为@Basic;...
  • 但是query的时候只显示部分字段 这是schema.xml ![图片说明](https://img-ask.csdn.net/upload/201704/11/1491880221_743918.png) 这是data-config.xml ![图片说明]...
  • cursor=contentResolver.query(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI ,new String[]{MediaStore.Images.Thumbnails.DATA} ,"MediaStore.Images.Thumbnails.IMAGE_ID=?" ,new String[]{imageSet.get...
  • @Query注解

    千次阅读 2019-08-11 14:23:47
    Query注解   有的时候,提供的查询关键字并不能满足我们的查询需求,这个时候就可以使用 @Query 关键字,来自定义查询 SQL,例如查询Id最大的User: @Query("select u from t_user u where id=(select max(id) ...
  • at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:153) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final] at org.hibernate.internal.AbstractSharedSessionContract....
  • queryRunner.query 方法

    千次阅读 2017-07-21 09:47:29
    public Map getUserByUserId_MAP(int userId){ Map map = null; //获取连接 Connection conn = DBConnectionUtil.getConnection();...QueryRunner queryRunner = new QueryRunner(); //拼接SQL String s
  • org.springframework.data.mongodb.UncategorizedMongoDbException: not authorized for query on db_mongo.system.namespaces; nested exception is com.mongodb.MongoException: not authorized for query on db_...
  • Elasticsearch Query String Query

    千次阅读 2015-11-12 17:06:21
    Query String Queryedit On this page Query string syntax Elasticsearch Reference:  master2.x 2.12.0 (current) 1.71.6 1.51.4 1.30.90 Getting Started Setup ...

空空如也

1 2 3 4 5 ... 20
收藏数 204,450
精华内容 81,780
关键字:

query