论坛首页 Java企业应用论坛

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

浏览 16348 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-01-19  
针对信用卡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
   发表时间:2007-01-24  
如果where条件的取值要在程序运行期间动态决定,该如何做?

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

后来找到了用filter的解决方法,但如果用where能解决最好了
0 请登录后投票
   发表时间:2007-03-06  
阔别这个项目一个月我也碰到这个问题了..
没办法,用楼上指点的明路Filter解决了问题.
filter 的用法 参见hibernate doc Chapter 17. Filtering data
0 请登录后投票
   发表时间:2007-04-28  
动态取的时候就考虑写criteria.
呵呵,应该是最笨的方法!
0 请登录后投票
   发表时间: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里面是否有求当前时间的函数
0 请登录后投票
   发表时间: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里面是否有求当前时间的函数

如果处处考虑数据库的移植性,将会浪费当前的数据的性能,因此,我一般只针对数据库考虑问题,尤其是程序上实现起来复杂的,但某个特定数据库却可以使用一个方法搞定的那种………………,
0 请登录后投票
   发表时间: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多疑问无法解决。
0 请登录后投票
   发表时间:2007-07-25  
s.invalid_date >=curdate() 这个条件可以写在hql的with条件中,没必要用filter.

用HQL的current_date()表达式。

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

0 请登录后投票
   发表时间:2007-07-31  
如果在set中配置的key不是另外表的关键字,条件也不需要用到key,是不是就不能用hql进行左连接查询了阿,
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics