`
eyejava
  • 浏览: 1270883 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

hibernate里面使用带on条件的left join

阅读更多
针对信用卡Card的评分Score ,两者的关系是one-to-many. 现在需要查询没有评分过或者评分已经实效的那些卡片。
在mysql下
sql: select c.* from card c left join score s on s.card_id = c.id and s.invalid_date >=curdate() where s.id is null
在hibernate中要使用left join必须声明关联映射,这里的关联是one-to-many, 在Card里面建一个Set scores,然后配置好
        <set name="scores" cascade="none" where="valid_date >= curdate()">
              <key column="CARD_ID"/>
              <one-to-many class="Score" />
        </set>
唯一特殊的就在于这个where,hql里面不能写on ,所以得on里面的条件都写在where里面,where里面是写的是字段名和针对不同数据库的sql,将导致不同数据库之间的移植增加一些工作量。
hql如下:select c from Card c left join c.scores s  where s.id is null
分享到:
评论
8 楼 lei_1021 2007-07-31  
如果在set中配置的key不是另外表的关键字,条件也不需要用到key,是不是就不能用hql进行左连接查询了阿,
7 楼 chenkan2000 2007-07-25  
s.invalid_date >=curdate() 这个条件可以写在hql的with条件中,没必要用filter.

用HQL的current_date()表达式。

on中的过滤条件和where中的过滤条件在SQL语句中的执行顺序是不一样的。

6 楼 rinnix 2007-07-11  
<set name="scores" cascade="none" where="valid_date >= curdate()">
<key column="CARD_ID"/>
<one-to-many class="Score" />
</set>


请问lz,如果你的那个card表不仅仅与score表进行关联查询,而是在根据需求在不同情况与不同的表进行关联查询,那么该怎么去处理呢,还是要对这个set进行配置吗,不好意思刚开始用hibernate出现n多疑问无法解决。
5 楼 anweixiao 2007-05-30  
spiritfrog 写道
这里就已经丧失了数据库移植性了:<set name="scores" cascade="none" where="valid_date >= curdate()">
<key column="CARD_ID"/>
<one-to-many class="Score" />
</set>

where="valid_date >= curdate()" 就是用的sql,不是hsql.
不清楚hsql里面是否有求当前时间的函数

如果处处考虑数据库的移植性,将会浪费当前的数据的性能,因此,我一般只针对数据库考虑问题,尤其是程序上实现起来复杂的,但某个特定数据库却可以使用一个方法搞定的那种………………,
4 楼 spiritfrog 2007-05-28  
这里就已经丧失了数据库移植性了:
<set name="scores" cascade="none" where="valid_date >= curdate()">
<key column="CARD_ID"/>
<one-to-many class="Score" />
</set>

where="valid_date >= curdate()" 就是用的sql,不是hsql.
不清楚hsql里面是否有求当前时间的函数
3 楼 little-jj 2007-04-28  
动态取的时候就考虑写criteria.
呵呵,应该是最笨的方法!
2 楼 eyejava 2007-03-06  
阔别这个项目一个月我也碰到这个问题了..
没办法,用楼上指点的明路Filter解决了问题.
filter 的用法 参见hibernate doc Chapter 17. Filtering data
1 楼 xmzw 2007-01-24  
如果where条件的取值要在程序运行期间动态决定,该如何做?

试了改成where="field= :aaa"
然后在程序中query.setParameter("field", "value")
这样会出错

后来找到了用filter的解决方法,但如果用where能解决最好了

相关推荐

    hibernate的使用心得

    Hibernate支持多种连接类型,包括`inner join`(内连接)、`left outer join`(左外连接)、`right outer join`(右外连接)和`full join`(全连接)。`with`关键字用于提供额外的连接条件,类似于SQL中的`on`关键字...

    Hibernate问题解决

    - **RIGHT JOIN:** 直接在HQL中使用`RIGHT JOIN`语法,但由于Hibernate不支持直接的`RIGHT JOIN`语法,可以使用`LEFT JOIN`加上额外的条件来模拟`RIGHT JOIN`的效果: ```java String hql = "FROM UserInfo u ...

    hibernateHQL关联查询

    - **左外连接(Left Outer Join)**:除了返回两个表中满足连接条件的记录外,还会返回左表中不满足连接条件但右表中不存在匹配项的记录。 - **右外连接(Right Outer Join)**:除了返回两个表中满足连接条件的...

    hibernate查询语句--HQL

    left join Department as department on employee.DepNo = department.ID ``` 左连接会返回所有员工记录,即使他们在`Department`表中没有对应的记录也会显示为`null`。 3. **右连接**: ```hql select ...

    Hibernate查询语句教程a

    如在部门和员工的例子中,`select employee, department from Employee as employee join Department as department on employee.depNo = department.id`将返回所有部门和其对应的员工。 - **LEFT (OUTER) JOIN**:...

    Hibernate 查询语言

    from Employee as employee left join Department as department on employee.DepNo = department.ID ``` - **RIGHT OUTER JOIN**:返回右表的所有行以及左表中匹配的行;如果没有匹配,则左表的列值为 NULL。 ...

    关联关系按条件查询细

    1. **外连接**:分为左连接(LEFT JOIN)和右连接(RIGHT JOIN),在没有查询条件时,能获取所有信息,左边或右边表的所有记录都会被包含。当有查询条件时,只保留符合条件的关联记录。 2. **内连接**(INNER JOIN...

    Hibernate HQL教程

    SELECT s, c FROM Student s LEFT OUTER JOIN FETCH s.courses c ON c.cno = sc.cno; ``` - **解释**: 左外抓取连接会立即加载关联对象,提高性能。 ##### 1.4.7 右外连接 - **语法**: ```hql SELECT s, c FROM...

    HQL查询语言基础.

    employee.Name as name1, department.ID as id2, department.Name as name2 from Employee as employee right join Department as department on employee.DepNo = department.ID` - 结合LEFT JOIN和SELECT返回...

    HQL查询语言基础知识

    * LEFT JOIN:select employee.ID as id1,employee.Name as name1,department.ID as id2,department.Name as name2 from Employee as employee left join Department as department on employee.DepNo=department.ID...

    HQL连接查询和注解使用总结

    - 示例:`SELECT e FROM Employee e LEFT OUTER JOIN Department d ON e.departmentId = d.id` - **迫切左外连接(Eager Left Outer Join)** - 语法:`left[outer]join fetch` - 描述:左外连接的迫切形式,...

    Hibernate中的多表查询及抓取策略

    - 左外连接:`Select * from A left outer join B on 条件;` - 右外连接:`Select * from A right outer join B on 条件;` Hibernate提供了对应的API来实现这些查询: - **交叉连接**:在Hibernate中并不常见...

    HQL查询语言基础

    HQL支持不同类型的`join`,包括`inner join`(内连接)、`left outer join`(左外连接)、`right outer join`(右外连接)和`full join`(全连接)。 - **内连接(inner join)**: ```hql select employee.ID as...

    HQL查询语言基础!

    from Employee as employee left join Department as department on employee.DepNo = department.ID ``` - **右外连接(right outer join)**:返回右侧表(Department)的所有记录,如果左侧表(Employee)中...

    SSH+EASY-UI的账务管理系统

    用MAVEN,SPRING,...AS `goodsquality`,avg(`b`.`price`) AS `price`,`a`.`id` AS `id`,`a`.`name` AS `name` from (`goods` `a` left join `goodsprice` `b` on((`a`.`id` = `b`.`goods_id`))) group by `a`.`id`

    HQL 连接查询

    显式连接查询需要明确指定连接类型以及连接条件,使用`join`关键字来实现。这种方式更加灵活,可以控制更多的查询细节。例如: ```hql from Student as s inner join s.department as d where d.departmentName = '...

    mybatis-day02培训内容1

    2. 外连接(Outer Join):分为左外连接(Left Outer Join)、右外连接(Right Outer Join)和全外连接(Full Outer Join)。外连接会返回所有匹配和不匹配的记录,不匹配的记录用NULL填充。左外连接返回左表的所有...

    ibatis做连接查询 .doc

    LEFT JOIN t_class c ON d.dno = c.dno ``` 这里使用了LEFT JOIN来连接`t_depart`和`t_class`表,获取所有部门及其关联的班级信息。 4. **Mapper接口方法**: 在`DepartMapper`接口中,对应上述XML中的`...

    支付宝Java工程师笔试题

    ### 支付宝Java工程师笔试题解析 #### 智力部分 1. **烧绳问题** **题目:** 烧一根不均匀的绳子需要一个小时,如何利用这... 这种方式利用了索引加速连接操作,并通过`LEFT JOIN`和`WHERE`条件有效地过滤出了结果。

    JavaEE技术面试常见问题.doc

    - **使用工厂方法**:适用于需要根据条件创建不同类型对象的情况。 - **使用反射**:动态创建对象。 3. **基本数据类型与包装类的区别** - **基本数据类型**:如int、float等,存储在栈中。 - **包装类**:如...

Global site tag (gtag.js) - Google Analytics