利用ssh框架集,开发项目
使用hibernate进行实体映射,其中有一张复合主键的表,表结构如下CREATE TABLE PT_USER_ROLE_MAP (
       USER_ID              VARCHAR(10) NOT NULL,
       USER_NAME            VARCHAR(50),
       ROLE_ID              VARCHAR(4) NOT NULL,
       ROLE_NAME            VARCHAR(50),
       VALIDE_FLAG          VARCHAR(2),
       REMARK               VARCHAR(200)
);COMMENT ON TABLE PT_USER_ROLE_MAP IS 'pt_user_role_map';
COMMENT ON COLUMN PT_USER_ROLE_MAP.ROLE_ID IS '角色ID';
COMMENT ON COLUMN PT_USER_ROLE_MAP.USER_ID IS '用户ID';
COMMENT ON COLUMN PT_USER_ROLE_MAP.USER_NAME IS '用户名称';
COMMENT ON COLUMN PT_USER_ROLE_MAP.ROLE_NAME IS '角色名称';
COMMENT ON COLUMN PT_USER_ROLE_MAP.VALIDE_FLAG IS '有效果标志';
COMMENT ON COLUMN PT_USER_ROLE_MAP.REMARK IS '备注';ALTER TABLE PT_USER_ROLE_MAP
       ADD PRIMARY KEY (ROLE_ID, USER_ID);映射关系如下:<hibernate-mapping>
    <class name="com.adtec.datacenter.entity.manager.PtUserRoleMap" table="PT_USER_ROLE_MAP" schema="TEST">
        <composite-id name="id" class="com.adtec.datacenter.entity.manager.PtUserRoleMapId">
            <key-property name="roleId" type="java.lang.String">
                <column name="ROLE_ID" length="4" />
            </key-property>
            <key-property name="userId" type="java.lang.String">
                <column name="USER_ID" length="10" />
            </key-property>
        </composite-id>
        <property name="userName" type="java.lang.String">
            <column name="USER_NAME" length="50" />
        </property>
        <property name="roleName" type="java.lang.String">
            <column name="ROLE_NAME" length="50" />
        </property>
        <property name="valideFlag" type="java.lang.String">
            <column name="VALIDE_FLAG" length="2" />
        </property>
        <property name="re" type="java.lang.String">
            <column name="REMARK" length="200" />
        </property>
    </class>
</hibernate-mapping>这里是利用的MyEclipse的Hibernate映射功能,生成的映射实体类,把复合主键组成了一张ID表
我在Action中使用
HibernateTemplate.getHibernateTemplate().find();语句
那么,这里关于复合主键的HQL语句应该怎么写呢?我的写法是:List<PtUserRoleMap> userRoles = null;
List<Object> map = new ArrayList<Object>();
Object[] s = new Object[1];
s[0] = userId;
userRoles = this.getHibernateTemplate().find(
"select r.roleId from PtUserRoleMap r where r.userId = ?",s);但是这样写,老是报反射出错:InvocationTargetException
请问这到底是什么问题,这里HQL反射应该怎么写呢?

解决方案 »

  1.   

    你返回的是一个实体对象集合,而你的hql语句则是返回的是roleid集合
    所以不匹配,应该这样写:
    userRoles = this.getHibernateTemplate().find(
                    "from PtUserRoleMap r where r.userId = ?",s);
      

  2.   

    我疯了都,你好好看看你的那句HQL语句啊...
    userRoles = this.getHibernateTemplate().find(
                    "select r.roleId from PtUserRoleMap r where r.userId = ?",s);
    你的 s 是个数组啊,这里需要的是个String 类型的啊,它自己能匹配才怪...
      

  3.   


    userRoles = this.getHibernateTemplate().find(
                    "select r.id.roleId from PtUserRoleMap r where r.id.userId = ?",s[0]);
      

  4.   

    正解!呵呵,我后面仔细查看了hibernate的映射关系,发现了我的HQL语句的确有问题,在PtUserRoleMap中的主键只是Id,id中包含了userId和funcId,还是对这个映射不熟悉的缘故!
     
      

  5.   


    请查看getHibernateTemplate().find()方法的API,后面传的参数不一定是String类型,可以封装成Object类,当然,这里传的值是String类型罢了!
    find(String queryString, Object[] values)