hsql大全

本文介绍了Hibernate Query Language (HQL),一种面向对象的查询语言,支持继承和多态特性。文章详细解释了HQL的基本语法,包括from、select、where子句的使用方法,并提供了丰富的查询示例。

HQL:Hibernate Query Language
HQL是完全面向对象的查询语言,因此可以支持继承和多态等特征。
HQL查询依赖于Query类,每个Query实例对应一个查询对象,使用HQL查询按
如下步骤进行:
(1)获取Hibernate Session对象;
(2)编写HQL语句;
(3)以HQL语句作为参数,调用Session的createQuery方法创建查询对象;
(4)如果HQL语句包含参数,调用Query的setXxx方法为参数赋值;
(5)调用Query对象的list等方法遍历查询结果。
查询示例:
public class HqlQuery
...{
    public static void main(String[] args) throws Exception ...{
        HqlQuery mgr = new HqlQuery();
        //调用查询方法
        mgr.findPersons();
        //调用第二个查询方法
        mgr.findPersonByHappenDate();
        HibernateUtil.sessionFactory.close();
    }
    //第一个查询方法
    private void findPersons() ...{
        //获得Hibernate Session
        Session sess = HibernateUtil.currentSession();
        //开始事务
        Transaction tx = sess.beginTransaction();
        //以HQL语句创建Query对象
        //执行setString方法为HQL语句的参数赋值
        //Query调用list方法访问查询的全部实例
        List p1 = sess.createQuery("from Person p where o.myEvents.title = :
            eventTitle").setString("eventTitle", "很普通事情").list();
        //遍历查询的全部结果
        for (Iterator pit = p1.iterator(); pit.haxNext(); )
        ...{
            Person p = (Person)pit.next();
            System.out.println(p.getName());
        }
        //提交事务
        tx.commit();
        HibernateUtil.closeSession();
    }
    //第二个查询方法
    private void findPersonByHappenDate() throws Exception ...{
        Session sess = HibernateUtil.currentSession();
        Transaction tx = sess.beginTransaction();
        //解析出Date对象
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date start = sdf.parse("2007-11-27");
        System.out.println("系统开始通过日期查找人" + start);
        //通过Session的createQuery方法创建Query对象
        //设置参数
        //返回结果集
        List pl = sess.createQuery(
            "from Person p where p.myEvents.happenDate between :firstDate
            and :endDate")
                        .setDate("firstDate", start)
                        .setDate("endDate", new Date())
                        .list();
        //遍历结果集
        for (Iterator pit = pl.iterator(); pit.hasNext(); )
        ...{
            Person p = (Person)pit.next();
            System.out.println(p.getName());
        }
        tx.commit();
        HibernateUtil.closeSession();
    }
}

$下面介绍HQL语句的语法
1.from子句
from Person
表明从Person持久化类中选出全部的实例。
推荐:from Person as p

2.select子句
select p.name from Person as p
select p.name.firstName from Person as p
select new list(p.name, p.address) from Person as p
select new ClassTest(p.name, p.address) from Person as p (有前提)
select p.name as personName from Person as p
select new map(p.name as personName) from Person as p (与new map()结合更普遍)

3.聚集函数
avg,count,max,min,sum
select count(*) from Person
select max(p.age) from Person as p
select p.name || "" || p.address from Person as p

4.多态查询
from Person as p
from java.lang.Object o
from Named as n

5.where子句
from Person where name like "tom%"
from Person as p where p.name like "tom%"
from Cat cat where cat.mate.name like "kit%"
    select * from cat_table as table1 cat_table as table2 where table1.mate =
    table2.id and table1.name like "kit%"
from Foo foo where foo.bar.baz.customer.address.city like "fuzhou%"
from Cat cat, Cat rival where cat.mate = rival.mate
select cat, mate
from Cat cat, Cat mate
where cat.mate = mate
from Cat as cat where cat.id = 123
from Cat as cat where cat.mate.id = 69
from Person as person
where person.id.country = ''AU''
    and person.id.medicareNumber = 123456
from Account as account
where account.owner.id.country = ''AU''
    and account.owner.id.medicareNumber = 123456
from Cat cat where cat.class = DomesticCat
from Account as a where a.person.name.firstName like "dd%" // 正确
from Account as a where a.person.name like "dd%" // 错误

6.表达式
from DomesticCat cat where cat.name between ''A'' and ''B''
from DomesticCat cat where cat.name in (''Foo'', ''Bar'', ''Baz'')
from DomesticCat cat where cat.name not between ''A'' and ''B''
from DomesticCat cat where cat.name not in (''Foo'', ''Bar'', ''Baz'')
from DomesticCat cat where cat.name is null
from Person as p where p.address is not null
<property name="hibernate.query.substitutions">true 1, false 0</property>
from Cat cat where cat.alive = true
from Cat cat where cat.kittens.size > 0
from Cat cat where size(cat.kittens) > 0
from Calendar cal where maxelement(cal.holidays) > current date
from Order order where maxindex(order.items) > 100
from Order order where minelement(order.items) > 10000
//操作集合元素
select mother from Cat as mother, Cat as kit
where kit in elements(foo.kittens)
//p的name属性等于集合中某个元素的name属性
select p from NameList list, Person p
where p.name = some elements(list.names)
//操作集合元素
from Cat cat where exists elements(cat.kittens)
from Player p where 3 > all elements(p.scores)
from Show show where ''fizard'' in indices(show.acts)
//items是有序集合属性,items[0]代表第一个元素
from Order order where order.items[0].id = 1234
//holidays是map集合属性,holidays[national day]是代表其中第一个元素
select person from Person person, Calendar calendar
where calendar.holidays[''national day''] = person.birthDay
    and person.nationality.calendar = calendar
//下面同时使用list集合和map集合属性
select item from Item item, Order order
where order.items[order.deliveredItemIndices[0]] = item and order.id = 11
select item from Item item, Order order
where order.items[maxindex(order.items)] = item and order.id = 11

select item from Item item, Order order
where order.items[size(order.items) - 1] = item

select cust
from Product prod,
    Store store
    inner join store.customers cust
where prod.name = ''widget''
    and store.location.name in [''Melbourne'', ''Sydney'']
    and prod = all elements(cust.currentOrder.lineItems)

SELECT cust.name, cust.address, cust.phone, cust.id, cust.current_order
FROM customers cust,
    stores store,
    locations loc,
    store_customers sc,
    product prod
WHERE prod.name = ''widget''
    AND store.loc_id = loc.id
    AND loc.name IN (''Melbourne'', ''Sydney'')
    AND sc.store_id = store.id
    AND sc.cust_id = cust.id
    AND prod.id = ALL(
        SELECT item.prod_id
        FROM line_items item, orders o
        WHERE item.order_id = o.id
            AND cust.current_order = o.id
    )

7.order by子句
from Person as p
order by p.name, p.age
from Person as p
order by p.name asc, p.age desc

8.group by子句
select cat.color, sum(cat.weight), count(cat)
from Cat cat
group by cat.color
//select后出现的id处出现在group by之后,而name属性则出现在聚集函数中
select foo.id, avg(name), max(name)
from Foo foo join foo.names name
group by foo.id

select cat.color, sum(cat.weight), count(cat)
from Cat cat
group by cat.color
having cat.color in (eg.Color.TABBY, eg.Color.BLACK)

select cat
from Cat cat
join cat.kittens kitten
group by cat
having avg(kitten.weight) > 100
order by count(kitten) asc, sum(kitten.weight) desc

9.子查询
from Cat as fatcat
where fatcat.weight > (select avg(cat.weight) from DomesticCat cat)

from Cat as cat
where not (cat.name, cat.color) in (
    select cat.name, cat.color from DomesticCat cat
)

10.fetch关键字
from Person as p join p.scores

from Document fetch all properties order by name
from Document doc fetch all properties where lower(doc.name) like ''%cat%''

11.命名查询
<!--定义命名查询-->
<query name="myNamedQuery">
    <!--此处确定命名查询的HQL语句-->
    from Person as p where p.age > ?
</query>

调用命名查询的示例代码如下:
private void findByNamedQuery() throws Exception ...{
    Session session = HibernateUtil.currentSession();
    Transaction tx = session.beginTransaction();
    System.out.println("执行命名查询");
    //调用命名查询
    List pl = sess.getNamedQuery("myNamedQuery")
                                    //为参数赋值
                                    .setInteger(0, 20)
                                    //返回全部结果
                                    .list();
    //遍历结果集
    for (Integer pit = pl.iterator(); pit.hasNext(); )
    ...{
        Person p = (Person)pit.next();
        System.out.println(p.getName());
    }
    tx.commit();
    HibernateUtil.closeSession();
}

03-27
<think>好的,用户想了解HSQL。首先,我需要确定HSQL具体指什么。HSQL可能有多种含义,比如HSQL数据库、Hibernate查询语言,或者其他领域的缩写。 首先,HSQL最常见的是HSQLDB(HyperSQL Database),这是一个关系型数据库管理系统,用Java编写,支持SQL标准,常用于嵌入式数据库或内存数据库。用户可能是在问这个。 另外,Hibernate框架中的HQL(Hibernate Query Language)有时也被简称为HSQL,不过通常缩写为HQL,所以可能性较小,但需要确认。 还可能存在其他领域的HSQL,比如某种工具或特定系统的查询语言,但相对少见。 接下来,我需要整理HSQLDB的主要信息,包括其特点、使用场景、基本用法、优缺点等,确保内容结构清晰,符合用户的要求。 需要检查是否有拼写错误或误解,比如确认HSQLDB的正确名称和用途。同时,要使用中文,遵循格式要求,数学表达式用$...$,独立公式用$$...$$,但这里可能涉及代码示例,需要判断是否需要使用代码块,但用户未特别要求代码格式,所以可能用文字描述更合适。 最后,组织回答,先介绍HSQLDB,再说明其他可能的含义,确保覆盖用户可能的需求,同时保持回答真实可靠。</think>HSQL 通常指两种技术概念,具体含义需结合上下文判断。以下是两种常见解释: --- ### 1. **HSQLDB(HyperSQL Database)** #### 基本介绍 HSQLDB 是一个轻量级、开源的关系型数据库管理系统(RDBMS),完全用 Java 编写,遵循 SQL 标准。它支持内存数据库和磁盘数据库模式,常用于嵌入式系统、单元测试或小型应用。 #### 主要特点 - **轻量高效**:仅需几百 KB 的 JAR 文件即可运行。 - **运行模式灵活**: - **内存模式**:数据仅保存在内存中,重启后消失。 - **文件模式**:数据持久化到磁盘。 - **服务器模式**:通过 TCP/IP 提供服务。 - **兼容性**:支持 SQL:2016 标准,兼容多数主流数据库语法(如 MySQL、PostgreSQL)。 - **事务支持**:提供 ACID 事务保证。 #### 典型应用场景 - 开发测试(如替代生产数据库进行快速测试)。 - 嵌入式系统(如桌面应用内置数据库)。 - 教育演示(因配置简单)。 #### 简单示例 ```java // Java 中连接 HSQLDB 内存数据库 Connection conn = DriverManager.getConnection("jdbc:hsqldb:mem:mydb", "SA", ""); Statement stmt = conn.createStatement(); stmt.execute("CREATE TABLE test (id INT, name VARCHAR(50))"); ``` --- ### 2. **Hibernate Query Language(HQL)** 若用户误将 HQL 写作 HSQL,则指 **Hibernate 框架的查询语言**: - **用途**:面向对象的方式操作数据库,语法类似 SQL,但操作对象是 Java 类和属性。 - **示例**: ```sql FROM Employee WHERE salary > 5000 -- 查询工资超过5000的员工 ``` --- ### 如何区分? - **HSQLDB**:明确指数据库系统,常用于 Java 应用的嵌入式场景。 - **HQL**:与 ORM 框架 Hibernate 关联,用于对象查询。 如需进一步了解某项技术,请提供更多上下文!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值