我的本意是想这句HQL语句"FROM RoleVO as a left join a.UserRoleVO as b where b.userID=?"让roleVO的roleID和userRoleVO的roleID相等的联合查询,
       
     但是我发现程序却变成了FROM RoleVO as a left join a.UserRoleVO on RoleVO.roleID=UserRoleVO.userRoleID(UserRoleVO的主键) as b where b.userID=?"
我 想问如何配置才能让roleVO的roleID和userRoleVO的roleID相等的联合查询,我的映射关系到底是一对一还是多对一????麻烦大哥们说的详细点,谢谢了
role.hbm.xml
    <hibernate-mapping>
    <class name="com.shili2.vo.RoleVO" table="role" schema="dbo" catalog="shilikaifa">
        <id name="roleID" type="java.lang.String">
            <column name="roleID" length="50" />
            <generator class="assigned" />
        </id>
        <property name="roleCode" type="java.lang.String">
            <column name="roleCode" length="50" />
        </property>
        <property name="roleName" type="java.lang.String">
            <column name="roleName" length="20" />
        </property>
          <many-to-one name="UserRoleVO" class="com.shili2.vo.UserRoleVO"
         fetch="select" update="false" insert="false">
         <column name="roleID" />
        </many-to-one>
    </class>
</hibernate-mapping>userRole.hbm.xml<hibernate-mapping>
    <class name="com.shili2.vo.UserRoleVO" table="userRole" schema="dbo" catalog="shilikaifa">
        <id name="userRoleID" type="java.lang.Integer">
            <column name="userRoleID" />
            <generator class="native"/>
        </id>
        <property name="userID" type="java.lang.String">
            <column name="userID" length="50" />
        </property>
        <property name="roleID" type="java.lang.String" update="false" insert="false">
            <column name="roleID" length="50" />
        </property>
        <property name="password" type="java.lang.String">
            <column name="password" length="50" />
        </property>
        <set name="role" inverse="true">
            <key>
                <column name="roleID" />
            </key>
            <one-to-many class="com.shili2.vo.RoleVO" />
        </set>
    </class>
</hibernate-mapping>roleVO
public class RoleVO {
private String roleID;
private String roleCode;
private String roleName;
private UserRoleVO userRoleVO;
public UserRoleVO getUserRoleVO() {
return userRoleVO;
}
public void setUserRoleVO(UserRoleVO userRoleVO) {
this.userRoleVO = userRoleVO;
}
public String getRoleID() {
return roleID;
}
public void setRoleID(String roleID) {
this.roleID = roleID;
}
public String getRoleCode() {
return roleCode;
}
public void setRoleCode(String roleCode) {
this.roleCode = roleCode;
}
public String getRoleName() {
return roleName;
}
public void setRoleName(String roleName) {
this.roleName = roleName;
}


}userRoleVO
public class UserRoleVO {
private int userRoleID;
private String userID;
private String roleID;
private String password;
private Set role;
public String getRoleID() {
return roleID;
}
public void setRoleID(String roleID) {
this.roleID = roleID;
}
public int getUserRoleID() {
return userRoleID;
}
public void setUserRoleID(int userRoleID) {
this.userRoleID = userRoleID;
}
public String getUserID() {
return userID;
}
public void setUserID(String userID) {
this.userID = userID;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Set getRole() {
return role;
}
public void setRole(Set role) {
this.role = role;
}

}

解决方案 »

  1.   

    很明显一对一,不用写那样的HQL语句,直接查一个表就可以了,一对一默认延迟加载!
      

  2.   

    根据持久类和映射文件可以看出楼主想配置的是roleVO到userRoleVO的多对一双向关联关系映射,但是楼主在映射文件中有两个地方配置错了:
    (1)在多对一中我们要把外键加到多的一段,所以这里要做修改(用红色表示)
         <many-to-one name="UserRoleVO" class="com.shili2.vo.UserRoleVO"
                fetch="select" update="false" insert="false">
                <column name="userRoleID" />
         </many-to-one>
    (2)这里set中要与上面对应:
            <set name="role" inverse="true">
                <key>
                    <column name="userRoleID" />
                </key>
                <one-to-many class="com.shili2.vo.RoleVO" />
            </set>
      

  3.   

    晕,我现在不是要配置userRoleID和roleID相等,我是要让userVO的roleID和roleVO的roleID相等啊!!!!!!!!
      

  4.   

    那你不就越搞越麻烦了,你意思想配置一对一的主键关联
    你自己看看你的javabean
      

  5.   

    一对一主键关联用的是<one-to-one>标签
      

  6.   

    one-to-one怎么配置呢,主要我那HQL的查询语句想问
    如何配置才能让roleVO的roleID和userRoleVO的roleID相等主要这个我不知道怎么配置
      

  7.   

    配置为多对多,把现在一的一方配置为<set>
      

  8.   

    楼主可以在任何一段的id生成器中配置这个标签去引用对方表的的主键:
    比如:在roleVO映射文件中加
    <generator class="foreign">
            <param name="property">userRoleVO</param>
    </generator> 
    最后在加个约束标签
    <one-to-one name="userRoleVO" constrained="true" />在userRoleVO的映射文件中只加这一句就行了
    <one-to-one name="roleVO" cascade="all" /> 最后再把UserRoleVO这个类的Set属性取了,换成RoleVO roleVO;并加上set\get方法就行了
      

  9.   

    关键是我这个HQL语句能运行的起来FROM RoleVO as a left join a.UserRoleVO as b where b.userID=?让roleVO的roleID和userRoleVO的roleID相等,高手能不能说详细点呢
      

  10.   


    这样不就变成userRoleVO的userRoleID和roleVO的roleID对应了??我只是想让roleVO的roleID和userRoleVO的roleID相等
      

  11.   

    楼主的配置是多对一关系,一般都不会用到联合查询。
    联合查询都是在多对多关系中出现的,同时要提供两个条件 如 roleID=? and userID=?根据楼主配置,HQL语句应该是这样的吧 "from RoleVO a where a.UserRoleVO.userID=?"
    对象关系映射,还join什么呀
      

  12.   

    我只是想让roleVO的roleID和userRoleVO的roleID相等
    我只是想让roleVO的roleID和userRoleVO的roleID相等
    我只是想让roleVO的roleID和userRoleVO的roleID相等
    我只是想让roleVO的roleID和userRoleVO的roleID相等
    我只是想让roleVO的roleID和userRoleVO的roleID相等
    我只是想让roleVO的roleID和userRoleVO的roleID相等
    我只是想让roleVO的roleID和userRoleVO的roleID相等
    我只是想让roleVO的roleID和userRoleVO的roleID相等
    我只是想让roleVO的roleID和userRoleVO的roleID相等

    "from RoleVO a where a.UserRoleVO.userID=?"我试试把,看看能让roleVO的roleID和userRoleVO的roleID相等
      

  13.   


    不行,确实要联合查询才可以得到数据啊```而且我映射关系有错,帮忙看看如何配置让roleVO的roleID和userRoleVO的roleID相等把,我就问这个了
      

  14.   


    <set name="UserRoleVO">
    <key column="roleID" />
    <many-to-many class="UserRoleVO" column="roleID" />
    </set>我最烦配置多对多的你自己看看吧,另外我从来不用join,对于fetch的配置你自己斟酌
      

  15.   

    没办法。我也没接触过HIBERNATE,比较烦这映射关系,好象真是多对多关系。。我再试试把
      

  16.   

    但是有个问题,如果配置多对对我的HQL语句是该怎么写关系,主要我是想让roleVO的roleID和userRoleVO的roleID相等这样的语句啊```配置成多对多就不能用"FROM RoleVO as a left join a.UserRoleVO as b where b.userID=?"这个联合查询了
      

  17.   

    select * from RoleVO a where exists(select 1 from UserRoleVO b where a.roleid = b.roleid and b.userid = ? )
      

  18.   

    select 1 from UserRoleVO b where a.roleid = b.roleid and b.userid = ? 
    晕``````不介意我问问你这个1应该是*把,你这菊花的意思是如果存在select * from UserRoleVO b where a.roleid = b.roleid and b.userid = ? 就查询出select * from RoleVO这个把
      

  19.   

    你照着写就是了,那里就是1,这个是常量exists的语法
    查询结果为RoleVO,通过子查询对其数据过滤,
      

  20.   

    你的HQL报错了unexpected token: * near line 1, column 8 
      

  21.   

    select a from RoleVO a where exists(select 1 from UserRoleVO b where a.roleid =
     b.roleid and b.userid = ? )
      

  22.   

    另外我映射多对多关系老是说认不到ROLEID
      

  23.   

    那个我解决了,hql语句是认不到*号的