0

我如何写入 HQL 查询?这是我的原始场景我有两个 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

匹配两个表中条件MAMAID(+)=TROHAMAID在 oracle 中的记录。请告诉如何编写 HQL。

4

2 回答 2

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 server 等)都相同。只是我们需要在主配置文件中更改数据库连接。

您的模型类将如下所示

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 对象时,休眠也会加载内部对象引用“advmagencymaster”。

为此,您需要指定lazy="false" 而不是fetch="select"。

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

懒惰-“假” - 急切加载它将加载子(内部)对象也与父对象。

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

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

就在会话工厂关闭标记之前,映射发生在数据库中。

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

额外的过滤我们可以在主查询之后添加'where'子句。这里只需要加入条件,它已经被hibernate处理了。

于 2013-09-02T06:04:46.470 回答
0

请检查这个,

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

带有 on 子句

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

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

于 2013-09-02T06:07:53.493 回答