在HQL查询中加入条件?

时间:2013-09-02 05:29:49

标签: oracle hibernate hql

如何写入HQL查询? 这是My Original场景我有两个hbm文件ADVMAgencyMaster.hbm.xml,ADVRoheader.hbm.xml对应的pojo类是ADVMAgencyMaster.java,ADVroheader.java。

<hibernate-mapping>
    <class name="com.adv.hibernatebean.ADVMAgencyMaster" table="ADVMAGENCYMASTER" catalog="MEDIAERP">
        <id name="mamaid" type="java.lang.String">
            <column name="MAMAID" length="10" />
            <generator class="assigned"></generator>
        </id>
        <property name="mamaname" type="java.lang.String">
            <column name="MAMANAME" length="50" />
        </property>
</hibernate-mapping>


<hibernate-mapping>
    <class name="com.adv.hibernatebean.ADVRoheader" table="ADVTROHEADER" schema="MEDIAERP">
        <id name="trohiono" type="java.lang.String">
            <column name="TROHIONO" />
            <generator class="assigned"></generator>
        </id>
        <many-to-one name="advmagencymaster" class="com.adv.hibernatebean.ADVMAgencyMaster" fetch="select">
            <column name="TROHAMAID" />
        </many-to-one>
</hibernate-mapping>

我的oracle查询是

SELECT MAMAID,MAMANAME,TROHIONO 
  FROM ADVAGENCYMASTER,ADVROHEADER 
 WHERE MAMAID(+)=TROHAMAID

匹配来自oracle中条件为MAMAID(+)=TROHAMAID的两个表的记录。请告诉HQL中的编写者。

2 个答案:

答案 0 :(得分:1)

对应的是HQL

  select header.advmagencymaster.mamaid,
         header.advmagencymaster.mamaname,header.trohiono 
         from ADVRoheader header 

但在HQL中,最好检索整个对象,以便我们也可以使用其他属性

   from ADVRoheader header 
   inner join 
   header.advmagencymaster master

HQL不依赖于底层数据库。对于所有数据库(Oracle,Mysql,SQL服务器等)都是一样的。只有我们需要更改主配置文件中的数据库连接。

您的模型类将如下所示

class ADVMAgencyMaster{
  private String mamaid;
 private String mamaname;  //getters and setters
}

class ADVRoheader{
 private String trohiono;
 private ADVMAgencyMaster advmagencymaster;     // Reference to the ADVMAgencyMaster
 //getters and setters}

您已经在xml中定义了多对一关系

 <many-to-one name="advmagencymaster" class="com.adv.hibernatebean.ADVMAgencyMaster" fetch="select"> <column name="TROHAMAID" /></many-to-one>

因此,在加载ADVRoheader对象时,hibernate也将加载内部对象引用“advmagencymaster”。

为此你需要指定lazy =“false”而不是fetch =“select”。

lazy =“true” - 延迟加载它只会加载父对象

lazy-“false” - 急切加载它也会加载父对象的子(内部)对象。

将两个hbm.xml文件添加到主配置文件(hibernate.cfg.xml)中,如下所示

 <mapping resource="com/ADVRoheader.hbm.xml"></mapping>
 <mapping resource="com/ADVRomaster.hbm.xml"></mapping> 

在会话工厂结束标记之前,数据库正在进行映射。

通常对于生成元素,我们需要使用类型整数并在数据库中进行更改。

额外过滤我们可以在主查询之后添加'where'子句。这里只需要连接条件并且已经由hibernate处理。

答案 1 :(得分:0)

请检查一下,

from  ADVMAgencyMaster master 
       inner join 
       ADVRoheader header
Where  master.mamaid = (userInputId)

使用on Clause

from  ADVMAgencyMaster master 
       inner join 
       ADVRoheader header on master.mamaid = header.trohamaid
Where  master.mamaid = (userInputId) //optional, it will filter row as per user input

当连接类型为内部时,On Clause自动执行/执行Where过滤器。