精华内容
下载资源
问答
  • HQL检索方式

    2017-06-14 16:23:23
    HQL检索方式HQL检索方式 HQL 检索方式包括以下步骤 分页查询 映射文件定义查询语句 投影查询HQL 检索方式包括以下步骤: 通过 Session createQuery() 方法创建一个 Query 对象, 它包括一个 HQL 查询语句. HQL 查询...

    HQL检索方式


    HQL 检索方式包括以下步骤:

    1. 通过 Session 的 createQuery() 方法创建一个 Query 对象, 它包括一个 HQL 查询语句. HQL 查询语句中可以包含命名参数
    2. 动态绑定参数
    3. 调用 Query 相关方法执行查询语句.

    1. 绑定参数:

      • Hibernate 的参数绑定机制依赖于 JDBC API 中的 PreparedStatement 的预定义 SQL 语句功能.
      • HQL 的参数绑定由两种形式:

        • 按参数名字绑定: 在 HQL 查询语句中定义命名参数, 命名参数以 “:” 开头.
        • 按参数位置绑定: 在 HQL 查询语句中用 “?” 来定义参数位置
      • 相关方法:
        • setEntity(): 把参数与一个持久化类绑定
        • setParameter(): 绑定任意类型的参数. 该方法的第三个参数显式指定 Hibernate 映射类型

    分页查询:

    • setFirstResult(int firstResult): 设定从哪一个对象开始检索, 参数 firstResult 表示这个对象在查询结果中的索引位置, 索引位置的起始值为 0. 默认情况下, Query 从查询结果中的第一个对象开始检索

    • setMaxResults(int maxResults): 设定一次最多检索出的对象的数目. 在默认情况下, Query 和 Criteria 接口检索出查询结果中所有的对象


    映射文件定义查询语句

    Hibernate 允许在映射文件中定义字符串形式的查询语句.

    • < query > 元素用于定义一个 HQL 查询语句, 它和 < class> 元素并列.
     <query name="findgyid"><![CDATA[FROM student s where s.sname like:sname]]></query>
    • 在程序中通过 Session 的 getNamedQuery() 方法获取查询语句对应的 Query 对象.

    投影查询

    • 投影查询: 查询结果仅包含实体的部分属性. 通过 SELECT 关键字实现.

    • Query 的 list() 方法返回的集合中包含的是数组类型的元素, 每个对象数组代表查询结果的一条记录

    • 可以在持久化类中定义一个对象的构造器来包装投影查询返回的记录, 使程序代码能完全运用面向对象的语义来访问查询结果集.

    • 可以通过 DISTINCT 关键字来保证查询结果不会返回重复元素

    展开全文
  • Hibernate检索方式导航对象图检索方式OID 检索方式: 按照对象 OID 来检索对象HQL 检索方式: 使用面向对象 HQL 查询语言绑定参数查询按参数名字绑定按参数位置绑定分页查询在映射文件中定义命名查询语句投影查询...

    导航对象图检索方式

    根据已经加载的对象导航到其他对象
    样例:

     Order order=session.get(Order.class, 1);
      order.getCustomer();

    OID 检索方式: 按照对象的 OID 来检索对象

    Order order=session.get(Order.class, 1);
      order.getCustomer();

    HQL 检索方式: 使用面向对象的 HQL 查询语言

    测试案例:
    1)永久化类

    public class Employee {
     private Integer id;
     private String name;
     private float salary;
     private String email;
     private Department dept;}
    public class Department {
     private Integer id;
     private String name;
     private Set<Employee> emps=new HashSet<>();}
    

    2)实体关系配置表

    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <!-- Generated 2020??4??19?? ????5:15:24 by Hibernate Tools 3.5.0.Final -->
    <hibernate-mapping>
        <class name="com.atguigu.hibernate.entities.Department" table="GG_DEPARTMENT">
            <id name="id" type="java.lang.Integer">
                <column name="ID" />
                <generator class="native" />
            </id>
            <property name="name" type="java.lang.String">
                <column name="NAME" />
            </property>
            <set name="emps" table="GG_EMPLOYEE" inverse="true" lazy="true">
                <key>
                    <column name="DEPT_ID"/>
                </key>
                <one-to-many class="com.atguigu.hibernate.entities.Employee" />
            </set>
        </class>
    </hibernate-mapping>
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <!-- Generated 2020??4??19?? ????5:15:24 by Hibernate Tools 3.5.0.Final -->
    <hibernate-mapping>
        <class name="com.atguigu.hibernate.entities.Employee" table="GG_EMPLOYEE">
            <id name="id" type="java.lang.Integer">
                <column name="ID" />
                <generator class="native" />
            </id>
            <property name="name" type="java.lang.String">
                <column name="NAME" />
            </property>
            <property name="salary" type="float">
                <column name="SALARY" />
            </property>
            <property name="email" type="java.lang.String">
                <column name="EMAIL" />
            </property>
            <many-to-one name="dept" class="com.atguigu.hibernate.entities.Department">
                <column name="DEPT_ID" />
            </many-to-one>
        </class>
    </hibernate-mapping>

    ##检索步骤
    1)通过Session的createQuery()方法创建一个Query对象,它包括一个HQL查询语句.HQL查询语句中可以包含命名参数
    2)动态绑定参数
    3)调用Query相关方法执行查询语句
    Qurey接口支持方法链编程风格,它的setXxx()方法返回自身实例,而不是void类型

    绑定参数查询

    Hibernate的参数绑定机制依赖于JDBCAPI中的PreparedStatement的预定义SQL语句功能。

    按参数名字绑定

    在HQL查询语句中定义命名参数,命名参数以“:”开头。

    String hql="From Employee e WHERE e.salary> :salar ";
      //String hql="From Employee e";
      Query<Employee> query=session.createQuery(hql);
      query.setFloat("salar", 200.0f);
      //query.setParameter("salar", 200.0f);也可以运行
      List<Employee> emps=query.list();
      System.out.println(emps);

    按参数位置绑定

    在HQL查询语句中用“?”来定义参数位置

    String hql="From Employee e WHERE e.salary> ? ";
    Query<Employee> query=session.createQuery(hql);
    //query.setParameter(0, 200.0f);报错
    //query.setFloat(0, 200.0f);报错

    在hibernate测试发现,参数查询设置参数对应的取值均报错。

    分页查询

    1)setFirstResult(intfirstResult):设定从哪一个对象开始检索,参数firstResult表示这个对象在查询结果中的索引位置,索引位置的起始值为0.默认情况下,Query从查询结果中的第一个对象开始检索
    2)setMaxResults(intmaxResults):设定一次最多检索出的对象的数目.在默认情况下,Query和Criteria接口检索出查询结果中所有的对象

    String hql="From Employee";
      Query query=session.createQuery(hql);
      int pageNo=3;
      int pageSize=5;
      List<Employee> emps=query.setFirstResult((pageNo-1)*pageSize).setMaxResults(pageSize).list();
      System.out.println(emps);

    在映射文件中定义命名查询语句

    1)Hibernate 允许在映射文件中定义字符串形式的查询语句.
    2)<query> 元素用于定义一个 HQL 查询语句, 它和 元素并列.
    3)在程序中通过 Session 的 getNamedQuery() 方法获取查询语句对应的 Query 对象
    示例代码:
    1)实体关系文件中配置

        <query name="salaryEmps">
         <![CDATA[FROM Employee e where e.salary>:minsal and e.salary<:maxSal]]>
        </query>
    </hibernate-mapping>

    2)代码测试

    public void test() {
      Query query=session.getNamedQuery("salaryEmps");
      List<Employee> emps=query.setParameter("minsal", 800f).setParameter("maxSal", 6000f).list();
      System.out.println(emps.size());
     } 

    投影查询

    1)投影查询:查询结果仅包含实体的部分属性.通过SELECT关键字实现
    2)Query的list()方法返回的集合中包含的是数组类型的元素,每个对象数组代表查询结果的一条记录

    public void test() {
      String hql="select e.email,e.salary from Employee e where e.dept=:dept";
      Query query=session.createQuery(hql);
      Department dept=new Department();
      dept.setId(80);
      List<Object[]>result=query.setEntity("dept", dept).list();
      for(Object[] objs:result) {
       System.out.println(Arrays.asList(objs));
      }
     } 

    3)可以在持久化
    类中定义一个对象的构造器来包装投影查询返回的记录,使程序代码能完全运用面向对象的语义来访问查询结果集.

    public void test() {
      String hql="select new Employee(e.name,e.salary,e.dept) from Employee e where e.dept=:dept";
      Query query=session.createQuery(hql);
      Department dept=new Department();
      dept.setId(10);
      List<Employee>result=query.setEntity("dept", dept).list();
      for(Employee emp:result) {
       System.out.println(emp.toString());
      }
     } 

    4)可以通过DISTINCT关键字来保证查询结果不会返回重复元素

    public void test() {
      String hql = "SELECT min(e.salary), max(e.salary) "
        + "FROM Employee e "
        + "GROUP BY e.dept "
        + "HAVING min(salary) > :minSal";
      
      Query query = session.createQuery(hql)
                     .setFloat("minSal", 800);
      
      List<Object []> result = query.list();
      for(Object [] objs: result){
       System.out.println(Arrays.asList(objs));
      }
     } 

    HQL(迫切)左外连接

    在mysql语句中左外连接和迫切左外连接是没有区别的,但是在hibernate框架中是有区别的。
    含义:让左表和右表进行连接,左边的表必然出现,如果右边中没有满足条件的连接出现,左表数据仍然显示,只是连接的的数据为空。

    迫切左外连接

    1)LEFT JOINFETCH关键字表示迫切左外连接检索策略.
    2)list()方法返回的集合中存放实体对象的引用,每个Department对象关联的Employee集合都被初始化,存放所有关联的Employee的实体对象.
    3)查询结果中可能会包含重复元素,可以通过一个HashSet来过滤重复元素

    public void test() {
      String hql="SELECT DISTINCT d From Department d LEFT JOIN FETCH d.emps";
      //DISTINCT用于去除重复的Department,如果不加返回的记录数为实际的sql查询的返回记录数
      //此处的DISTINCT会在sql语句中出现,但是实际上在SQL语句上面没有明显的用处
      //因为sql语句部门+机构不会照成重复的sql语句
      Query query=session.createQuery(hql);
      List<Department> depts=query.list();
      System.out.println(depts.size());
      for(Department dept:depts) {
       System.out.println(dept.getName()+"-"+dept.getEmps().size());
      }
     } 
    public void test() {
      String hql="From Department d LEFT JOIN FETCH d.emps";
      Query query=session.createQuery(hql);
      List<Department> depts=query.list();
      depts=new ArrayList<>(new LinkedHashSet(depts));
      //是为了去除重复
      System.out.println(depts.size());
      for(Department dept:depts) {
       System.out.println(dept.getName()+"-"+dept.getEmps().size());
      }
     } 

    左外连接

    1)LEFT JOIN关键字表示左外连接查询.
    2)list()方法返回的集合中存放的是对象数组类型
    3)根据配置文件来决定Employee集合的检索策略.
    4)如果希望list()方法返回的集合中仅包含Department对象,可以在HQL查询语句中使用SELECT关键字

    public void test() {
      String hql="SELECT DISTINCT d From Department d LEFT JOIN d.emps";
      //DISTINCT去除重复,select d是为了强制使得返回为Department类型,此处默认返回为object
      Query query=session.createQuery(hql);
      List<Department> depts=query.list();
      System.out.println(depts.size());
      for(Department dept:depts)
      {
       System.out.println(dept.getName()+","+dept.getEmps().size());
       //element并没有完成初始化
      }
     } 
    

    HQL(迫切)内连接

    迫切内连接

    1)INNER JOIN FETCH关键字表示迫切内连接,也可以省略INNER关键字
    2)list()方法返回的集合中存放Department对象的引用,每个Department对象的Employee集合都被初始化,存放所有关联的Employee对象

    内连接

    1)INNER JOIN关键字表示内连接,也可以省略INNER关键字
    2)list()方法的集合中存放的每个元素对应查询结果的一条记录,每个元素都是对象数组类型
    3)如果希望list()方法的返回的集合仅包含Department对象,可以在HQL查询语句中使用SELECT关键字

    关联级别运行时的检索策略

    1)如果在HQL中没有显式指定检索策略,将使用映射文件配置的检索策略.
    2)HQL会忽略映射文件中设置的迫切左外连接检索策略,如果希望HQL采用迫切左外连接策略,就必须在HQL查询语句中显式的指定它
    3)若在HQL代码中显式指定了检索策略,就会覆盖映射文件中配置的检索策略

    QBC 检索方式

    使用 QBC(Query By Criteria) API 来检索对象. 这种 API 封装了基于字符串形式的查询语句, 提供了更加面向对象的查询接口。
    QBC查询就是通过使用Hibernate提供的QueryByCriteriaAPI来查询对象,这种API封装了SQL语句的动态拼装,对查询提供了更加面向对象的功能接口
    1)测试示例

    public void test() {
      Criteria criteria=session.createCriteria(Employee.class);
      criteria.add(Restrictions.eq("id",15));
      Employee employee=(Employee) criteria.uniqueResult();
      System.out.println(employee);
     } 

    运行结果

    Hibernate: 
        select
            this_.ID as ID1_1_0_,
            this_.NAME as NAME2_1_0_,
            this_.SALARY as SALARY3_1_0_,
            this_.EMAIL as EMAIL4_1_0_,
            this_.DEPT_ID as DEPT_ID5_1_0_ 
        from
            GG_EMPLOYEE this_ 
        where
            this_.ID=?
    Employee [id=15]

    测试代码2

    public void test() {
      Criteria criteria=session.createCriteria(Employee.class);
      //and
      Conjunction conjunction=Restrictions.conjunction();
      conjunction.add(Restrictions.ilike("name", "a",MatchMode.ANYWHERE));
      Department dept=new Department();
      dept.setId(80);
      conjunction.add(Restrictions.eq("dept",dept));
      System.out.println(conjunction);
      //or
      Disjunction disjunction=Restrictions.disjunction();
      disjunction.add(Restrictions.ge("salary",6000f));
      disjunction.add(Restrictions.isNull("email"));
      
      criteria.add(disjunction);
      criteria.add(conjunction);
      
      criteria.list();
     } 

    测试结果

    Hibernate: 
        select
            this_.ID as ID1_1_0_,
            this_.NAME as NAME2_1_0_,
            this_.SALARY as SALARY3_1_0_,
            this_.EMAIL as EMAIL4_1_0_,
            this_.DEPT_ID as DEPT_ID5_1_0_ 
        from
            GG_EMPLOYEE this_ 
        where
            (
                this_.SALARY>=? 
                or this_.EMAIL is null
            ) 
            and (
                lower(this_.NAME) like ? 
                and this_.DEPT_ID=?
            )

    测试代码

    public void test() {
      Criteria criteria=session.createCriteria(Employee.class);
      criteria.setProjection(Projections.max("salary"));
      System.out.println(criteria.uniqueResult());
     } 

    测试结果

    Hibernate: 
        select
            max(this_.SALARY) as y0_ 
        from
            GG_EMPLOYEE this_
    12000.0

    测试代码:

    public void test() {
      Criteria criteria=session.createCriteria(Employee.class);
      criteria.addOrder(Order.asc("salary"));
      criteria.addOrder(Order.desc("email"));
      int pageSize=5;
      int pageNo=3;
      criteria.setFirstResult((pageNo-1)*pageSize)
        .setMaxResults(pageSize)
        .list();
     } 

    测试结果:

    Hibernate: 
        select
            this_.ID as ID1_1_0_,
            this_.NAME as NAME2_1_0_,
            this_.SALARY as SALARY3_1_0_,
            this_.EMAIL as EMAIL4_1_0_,
            this_.DEPT_ID as DEPT_ID5_1_0_ 
        from
            GG_EMPLOYEE this_ 
        order by
            this_.SALARY asc,
            this_.EMAIL desc limit ?,
            ?

    本地SQL检索方式

    本地SQL查询来完善HQL不能涵盖所有的查询特性

    public void test() {
      String sql="Insert into gg_department values(:value1,:value2)";
      Query query=session.createSQLQuery(sql);
      query.setParameter("value1", 280)
       .setParameter("value2", "ATGUIGU").executeUpdate();
     } 
    展开全文
  • 以前看一篇文章说查询数据库中表是先查询出整张表到内存里,再在里面取出需要值,但是有人说是直接在数据库中定义到需要数据而不用先查询出整张表,网上也没查到确切说法,请懂数据库查询检索的朋友指教...
  • QBC(Qurey ByCriteria)检索方式 采用HQL检索方式时,在应用程序中需要定义基于字符串形式HQL查询语句。QBC API提供了检索对象另一种方式,它主要由Criteria接口、Criterion接口和Expression类组成,它支持在...

       采用HQL检索方式时,在应用程序中需要定义基于字符串形式的HQL查询语句。QBC API提供了检索对象的另一种方式,它主要由Criteria接口、Criterion接口和Expression类组成,它支持在运行时动态生成查询语句。

    【例】雇员信息表


    测试类
    session=HibernateSessionFactory.getSession();
    			Criteria criteria=session.createCriteria(Employee.class);
    			Criterion criterion=Restrictions.ilike("emp_name", "李%");
    			criteria=criteria.add(criterion);
    			List result=criteria.list();
    			for (Object object : result) {
    				Employee emp=(Employee)object;
    				System.out.println(emp.getEmp_id()+" "+emp.getEmp_name()+" "+emp.getEmp_sex()+    
                            " "+emp.getEmp_birth()+" "+emp.getEmp_job()+" "+emp.getEmp_salary()); 
    			}	
    运行结果:


    展开全文
  • 对于PHP扩展开发和内核应用,...感触最深就是变量检索HashTable. php 内核中定义好了很多函数来直接操作不同数据类型,同一种方法,每个数据类型都有一个。 也许在内核中设计不会直接反应在PHP程序...

    对于PHP的扩展开发和内核应用,寸谋的翻译真心不错,讲的很有条理,只要大家回想起来C语言的基础语法,这就不是问题。


    关于PHP的生命周期,以PHP变量在内核中的实现

    感触最深的就是变量检索中的HashTable.


    php 内核中定义好了很多的函数来直接操作不同的数据类型,同一种方法,每个数据类型都有一个。


    也许在内核中的设计不会直接反应在PHP程序设计上,但还是思想上里外贯通的思想如果可以领会到,真的可以让你不惧怕任何的错误提示,至少你知道它为何这么提示,也许解决的方案一时想不起来,但是随时都可以想明白如何解决,只是是不是很优秀的解决方式。


    本文转自 jackdongting 51CTO博客,原文链接:http://blog.51cto.com/10725691/1954228

    展开全文
  • js正则表达式的定义方式 hi各位父老乡亲,こんにちはKaiqisanすうう,是一个会经常口胡的标准普通话玩家。今天来讲讲正则表达式的创建方式,能帮你更加深层地理解正则表达式,以及更加灵活地使用它。 它一共有两种...
  • GET(SELECT): Retrieve a specific Resource from the Server, or a listing of Resources. #从服务器检索特定资源,或资源列表。POST(CREATE): Create a new Resource on the Server. ...
  • 在设计中会存在对象关联关系...所以检索策略设置很重要。  再来看一个问题,从数据库中取对象时候。如果通过JDBC API来访问,需要自己定义connection,需要写冗长SQL语句,同时手动建立关联关系,如果使用HQL,
  • 也可以创建自定义中间件来自定义数据。 标准 条件用于指示数据库中过滤器选项,此选项类似于SQL WHERE,但是您可以使用所有必填字段和必填输入来命名每个条件。 种类 排序用于指示数据库中排序选项,此选项类似...
  • 2.集合的定义: 从面向对象上来说,集合也是一种对象,一种特殊的对象:对象的容器,用于存放,检索,操纵和传输对象。Java提供了用于管理集合的接口和类,包括接口,实现类和算法类。 3.集合中重要的接口:
  • 事务(Transaction)是并发控制单位,是用户定义的一个操作序列。这些操作要么都做,要么都不做,是一个不可分割工作单位。 事务就是逻辑上一组操作,要么全都成功,要么全都失败 事务特性? 原子性:任何...
  • 基于内容图像检索是计算机视觉一个重要课题,它包括基于颜色、基于纹理、基于形状图像检索,其中,今天我们讨论是相对简单基于颜色图像检索。我们知道,直方图是标识图像内容一种有效方式,因此这里...
  • 来源查询检索的研究

    2012-02-24 17:13:39
     (1)传统来源查询检索方式为基于内容索引查询。在这种方式中,用户通过一些定义查询语言通过提交查询来和搜索工具交互。搜索工具然后从文件内容中或一个来自文件内容先前计算索引来查看,将结果等级...
  • 视频检索

    2019-11-29 10:18:37
    2 采用vedioSearch的方式进行检索 3 采用yolo视频目标检测算法进行检索 下面针对三种方法进行详细说明 根据图像检索视频关键帧算法 step1:提取新闻片头关键帧 step2:提取整个新闻关键帧 step3:定义图像...
  • 采用JPQL检索方式时,在应用程序中需要定义基于字符串形式JPQL查询语句。QBC API提供了检索对象另一种方式,它提供了一种更加面向对象查询方法,应用程序不需要提供查询语句,而是通过QBC API中相关接口和...
  • 基于内容相似图片检索

    千次阅读 2017-01-01 13:57:23
     我们知道,直方图是标识图像内容一种有效方式,因此这里关键是要做到,仅仅比较它们直方图就能测量出两个图像相似度。需要定义一个测量函数来评估两个直方图之间差异程度或者相似程度。下面我们直奔话题。...
  • 也叫灰色文献,有特定内容、特定用途、特定读者范围、特定出版发行方式的文献。 包括会议文献、学位论文、专利文献、标准文献、科技报告、产品资料、政府出版物、档案资料。 一、学位论文检索与利用 1.什么是学位...
  • Python内置库包括功能强大模块,这些模块使检索模块,类和函数/方法抽象语法树(AST)并对其进行操作成为可能。 本文回顾了Python语法定义,Python抽象语法数据结构以及如何使用该数据结构功能编写简洁...
  • 结合XML数据检索技术

    千次阅读 2004-11-04 23:20:00
    网络检索无处不在!无论是显而易见搜索... 检索方式 一般来说,当检索结果集过大时(经常出现非常大情况),采取分页数据显示策略,即每次返回结果集中小部分数据,通过类似“上一页”、“下一页”操作
  • 全文检索介绍

    2021-03-01 00:01:24
    对于数据量大、数据结构不固定数据可采用全文检索方式搜索,比如百度、Google等搜索引擎、论坛站内搜索、电商网站站内搜索等。 什么是全文检索呢?先看一下百度百科专业定义。 为了能更好理解,我们先看一个...
  • 文章目录科技报告检索科技报告的含义科技报告的特点科技报告的类型科技...检索方式专利文献检索专利文献的定义专利文献的特点专利文献检索工具专利文献网络检索方式标准文献检索标准文献的定义标准文献的类型标准文献...
  • 根据客户定制需求和产品实例对属性描述方式对属性进行分类,在可拓学关联函数基础上分别定义它们相似度计算方法,根据AHP(Analytical Hierarchy Process)计算属性权重比,给出客户需求与产品实例...
  • 信息检索这个词含义非常广。仅从钱包中取出信用卡,然后输入信用卡号也属于信息检索的范畴。然而,从学术角度来讲,信息检索定义如下: 信息检索...信息检索正迅速取代传统数据库搜索的方式,成为信息获取主要...
  • 初识全文检索

    2020-08-20 16:35:18
    其实全文检索还有另外一种专业定义,先创建索引然后对索引进行搜索过程,就是全文检索。 倒排索引 倒排索引是一种存储数据的方式,与传统查找有很大区别: 传统查找:采用数据按行存储,查找时逐行扫描,或者...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,301
精华内容 520
关键字:

检索方式的定义