利用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反射应该怎么写呢?
使用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反射应该怎么写呢?
所以不匹配,应该这样写:
userRoles = this.getHibernateTemplate().find(
"from PtUserRoleMap r where r.userId = ?",s);
userRoles = this.getHibernateTemplate().find(
"select r.roleId from PtUserRoleMap r where r.userId = ?",s);
你的 s 是个数组啊,这里需要的是个String 类型的啊,它自己能匹配才怪...
userRoles = this.getHibernateTemplate().find(
"select r.id.roleId from PtUserRoleMap r where r.id.userId = ?",s[0]);
请查看getHibernateTemplate().find()方法的API,后面传的参数不一定是String类型,可以封装成Object类,当然,这里传的值是String类型罢了!
find(String queryString, Object[] values)