1. 类文件信息节选,为了表现的简明一点,特意把与该问题无关的信息删除了。/**
 * @hibernate.class
 *  table="COMM_USER_INFO"
 *  dynamic-insert="true"
 * dynamic-update="true"
 *  lazy="false"
 *  batch-size="5"
 * @hibernate.query
 *  name="getCountUserByUserId"
 *  query="SELECT COUNT(*) FROM User user WHERE user.userId = :userId"
 */
public class User extends BaseObject {
     private String id; // 用户 ID 号

     private String userId; // 用户名

     private String password; // 用户密码     /**
 * 获取属性 <TT>id</TT> 的值,用户逻辑 ID 号。
 * @return 返回属性 <TT>id</TT> 的值。
 * @hibernate.id
 *  type="java.lang.String"
 *  length="32"
 * column="ID"
 *  unsaved-value="null"
 *  generator-class="uuid.hex"
 */
public String getId() {
return id;
} /**
 * 设置属性 <TT>id</TT> 的值。
 * @param id 设置为属性 <TT>id</TT> 的值。
 */
public void setId(String id) {
this.id = id;
}

/**
 * 获取属性 <TT>userId</TT> 的值。
 * @return 返回属性 <TT>userId</TT> 的值。
 * @hibernate.property
 *  type="java.lang.String"
 *  length="32"
 *  not-null="true"
 * column="USER_ID"
 *  unique="true"
 *  index="UNI_IDX_USER_USERID"
 */
public String getUserId() {
return userId;
} /**
 * 设置属性 <TT>userId</TT> 的值。
 * @param userId 设置为属性 <TT>userId</TT> 的值。
 */
public void setUserId(String userId) {
this.userId = userId;
}
}2. ANT 中脚本节选(xdoclet.classpath使用为 xdoclet2 中的类和包)
<target name="generator-mapping" description="生成Mapping文件">
        <taskdef name="xdoclet" classname="org.xdoclet.ant.XDocletTask" classpathref="xdoclet.classpath"></taskdef>
<echo message="生成Mapping文件..."></echo>
<xdoclet>
<fileset dir="${basedir}/src">
<include name="dao/com/test/model/*.java"/>
</fileset>
<component classname="org.xdoclet.plugin.hibernate.HibernateMappingPlugin"
  destdir="${basedir}/src/dao" version="3.0" encoding="UTF-8" force="true"/>
</xdoclet>
</target>3. 生成后的 .hbm 映射文件
...
<hibernate-mapping>
  <class dynamic-update="true" optimistic-lock="version" lazy="false" table="COMM_USER_INFO" batch-size="5" dynamic-insert="true" name="com.test.model.User">
    <comment>用户基本信息表</comment>
    <id unsaved-value="null" name="id" column="ID" type="java.lang.String" length="32">
      <generator class="uuid.hex"/>
    </id>
    <property name="userId" column="USER_ID" length="32" unique="true" not-null="true" type="java.lang.String"></property>    <query name="getCountUserByUserId"><![CDATA[SELECT COUNT(*) FROM User user WHERE user.userId = :userId]]></query>
  </class>
</hibernate-mapping>4.问题详情:
大家一定注意到,这个映射文件中的 <query ...> ... </query> 信息被包含在 <class ...> ... </class> 标签里面,也正是因为这样,在程序中调用以下语句时,会报出后面的异常信息。调用语句:
dao.setObject(new User());
Map<String, String> paras = new HashMap<String, String>();
paras.put(User.USER_ID, userId);
Long count = (Long) dao.queryUniqueObject("getCountUserByUserId", paras);
return count.longValue() == 0 ? false : true;程序异常信息:
org.hibernate.MappingException: Named query not known: getCountUserByUserId
at org.hibernate.impl.AbstractSessionImpl.getNamedQuery(AbstractSessionImpl.java:70)
at org.hibernate.impl.SessionImpl.getNamedQuery(SessionImpl.java:1260)
at com.test.persistence.hibernate.HibernateGeneralDAO.queryUniqueObject(HibernateGeneralDAO.java:533)
at com.test.service.impl.UserManagerImpl.isUserExist(UserManagerImpl.java:159)
at com.test.service.impl.UserManagerImpl.save(UserManagerImpl.java:42)
at com.test.service.impl.UserManagerImpl$$FastClassByCGLIB$$f2e552fc.invoke(<generated>)
at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:191)
...其他信息省略不写。
5.调试结果:
如果把映射文件中的 <query ...> ... </query> 信息放到 <class ...> ... </class> 标签外面,则程序回复正常。如以下所示:
<hibernate-mapping>
  <class dynamic-update="true" optimistic-lock="version" lazy="false" table="COMM_USER_INFO" batch-size="5" dynamic-insert="true" name="com.test.model.User">
    <comment>用户基本信息表</comment>
    <id unsaved-value="null" name="id" column="ID" type="java.lang.String" length="32">
      <generator class="uuid.hex"/>
    </id>
    <property name="userId" column="USER_ID" length="32" unique="true" not-null="true" type="java.lang.String"></property>
  </class>
  <query name="getCountUserByUserId"><![CDATA[SELECT COUNT(*) FROM User user WHERE user.userId = :userId]]></query>
</hibernate-mapping>6.问在最后:
很显然,是 xdoclet 编译问题,请问各位大哥大姐我的 ANT 配置文件是不是写得有问题?我该不该进行适当修改呢?
各位大侠,有遇到过这样的问题吗?如果有如何解决呢,谢谢了!