如何写入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中的编写者。
答案 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过滤器。