Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将NamedQuery与复合类一起使用_Java_Hibernate - Fatal编程技术网

Java 将NamedQuery与复合类一起使用

Java 将NamedQuery与复合类一起使用,java,hibernate,Java,Hibernate,我在映射XML文件中定义了以下类: <class name="com.data.StateRefData" table="STATE_REF"> <composite-id name="primaryKey" class="com.data.StateRefPkData"> <key-property name="countryCode"> <column name="COUNTRY_CODE" />

我在映射XML文件中定义了以下类:

<class name="com.data.StateRefData" table="STATE_REF">
   <composite-id name="primaryKey" class="com.data.StateRefPkData">
       <key-property name="countryCode">
           <column name="COUNTRY_CODE"  />
        </key-property>

        <key-property name="state">
            <column name="STATE"  />
        </key-property>
    </composite-id>

   <property name="dialingCode" column="DIALING_CODE"></property>
   <property name="isActive" column="IS_ACTIVE"></property>
   <property name="localeCode" column="LOCALE_CODE"></property>
   <property name="stName" column="ST_NAME"></property>
</class> 
你知道如何将NamedQuery与复合查询一起使用吗

注意:我也尝试过:

stateQuery.setParameter("primaryKey", primaryKey);
它仍然有错误

新建(已编辑): 以下是执行代码时发生的HQL和SQL:

[DEBUG AST:223] --- HQL AST ---
 \-[QUERY] 'query'
    +-[SELECT_FROM] 'SELECT_FROM'
    |  \-[FROM] 'from'
    |     \-[RANGE] 'RANGE'
    |        +-[DOT] '.'
    |        |  +-[DOT] '.'
    |        |  |  +-[DOT] '.'
    |        |  |  |  +-[DOT] '.'
    |        |  |  |  |  +-[IDENT] 'com'
    |        |  |  \-[IDENT] 'data'
    |        |  \-[IDENT] 'StateRefData'
    |        \-[ALIAS] 'd'
    \-[WHERE] 'WHERE'
       \-[EQ] '='
          +-[DOT] '.'
          |  +-[IDENT] 'd'
          |  \-[IDENT] 'primaryKey'
          \-[COLON] ':'
             \-[IDENT] 'primaryKey'

[DEBUG AST:193] --- SQL AST ---
 \-[SELECT] QueryNode: 'SELECT'  querySpaces (STATE_REF)
    +-[SELECT_CLAUSE] SelectClause: '{derived select clause}'
    |  +-[SELECT_EXPR] SelectExpressionImpl: 'statere0_.COUNTRY_CODE as COUNTRY1_, statere0_.STATE as STATE' {FromElement{explicit,not a collection join,not a fetch join,fetch non-lazy properties,classAlias=d,role=null,tableName=STATE_REF,tableAlias=statere0_,colums={,className=com.data.StateRefData}}}
    |  \-[SQL_TOKEN] SqlFragment: 'statere0_.DIALING_CODE as DIALING3_60_, statere0_.IS_ACTIVE as IS4_60_, statere0_.LOCALE_CODE as LOCALE5_60_, statere0_.ST_NAME as ST6_60_'
    +-[FROM] FromClause: 'from' FromClause{level=1, fromElementCounter=1, fromElements=1, fromElementByClassAlias=[d], fromElementByTableAlias=[statere0_], fromElementsByPath=[], collectionJoinFromElementsByPath=[], impliedElements=[]}
    |  \-[FROM_FRAGMENT] FromElement: 'STATE_REF statere0_' FromElement{explicit,not a collection join,not a fetch join,fetch non-lazy properties,classAlias=d,role=null,tableName=STATE_REF,tableAlias=statere0_,colums={,className=com.data.StateRefData}}
    \-[WHERE] SqlNode: 'WHERE'
       \-[EQ] SqlNode: '='
          +-[DOT] DotNode: '(statere0_.COUNTRY_CODE, statere0_.STATE)' {propertyName=primaryKey,dereferenceType=2,propertyPath=primaryKey,path=d.primaryKey,tableAlias=statere0_,className=com.data.StateRefData,classAlias=d}
          |  +-[ALIAS_REF] IdentNode: '(statere0_.COUNTRY_CODE, statere0_.STATE)' {alias=d, className=com.data.StateRefData, tableAlias=statere0_}
          |  \-[IDENT] IdentNode: 'primaryKey' {originalText=primaryKey}
          \-[NAMED_PARAM] SqlNode: '?' 

是否有可能inCountryCode或inStateProvince为空或null?

是否有可能inCountryCode或inStateProvince为空或null?

能否提供通过打开SQL日志记录生成的SQL代码

以下是使用log4j.properties的示例:

log4j.logger.org.hibernate.SQL=DEBUG

更新#1

我不知道为什么现有的查询不起作用,但您也应该尝试一下。无需更新任何其他代码,因为传递POJO会自动将getter绑定到命名参数

<query name="findState">
    <![CDATA[ from
      com.data.StateRefData
        WHERE primaryKey.countryCode = :countryCode AND primaryKey.state = :state
    ]]>
</query>

能否提供通过打开SQL日志记录生成的SQL代码

以下是使用log4j.properties的示例:

log4j.logger.org.hibernate.SQL=DEBUG

更新#1

我不知道为什么现有的查询不起作用,但您也应该尝试一下。无需更新任何其他代码,因为传递POJO会自动将getter绑定到命名参数

<query name="findState">
    <![CDATA[ from
      com.data.StateRefData
        WHERE primaryKey.countryCode = :countryCode AND primaryKey.state = :state
    ]]>
</query>


您是否可以将sql语句的调试级别设置为DEBUG,如下所述:从日志中可以明显看出,查询是构造的。如果你知道它看起来是什么样子,你就会更容易意识到发生了什么wrong@Boris-我已经查看了生成的HQL和SQL语句。他们仍然没有提供太多帮助。我已经更新了我的答案。另外,为了便于将来参考,不带BNF的SQL查询(在[squre方括号]之间的内容)应该在日志中进一步向下打印。当数据库以上面的“树”格式显示时,很难读取和确定针对该数据库运行的真正SQL。@马特:对不起,log4j就是这样显示的。所以我只是把它复制/粘贴到这里。你能把sql语句的调试级别设置为DEBUG吗?就像这里解释的:从日志中很明显,查询是构造的。如果你知道它看起来是什么样子,你就会更容易意识到发生了什么wrong@Boris-我已经查看了生成的HQL和SQL语句。他们仍然没有提供太多帮助。我已经更新了我的答案。另外,为了便于将来参考,不带BNF的SQL查询(在[squre方括号]之间的内容)应该在日志中进一步向下打印。当数据库以上面的“树”格式显示时,很难读取和确定针对该数据库运行的真正SQL。@马特:对不起,log4j就是这样显示的。所以我只是复制/粘贴在这里。没有。我总是确保这里有一个值。我还使用Eclipse调试器对此进行了双重检查。我总是确保这里有一个值。我还使用Eclipse调试器对其进行了双重检查。@matt:我今天将尝试一下,并让您知道它是如何工作的。谢谢我确实需要更改一些Java代码。我删除了筛选器并执行了“stateQuery.setProperties(primaryKey)”,而不是filter.setProperty()。谢谢你的指导。@matt:我今天会试试这个,让你知道它是如何工作的。谢谢我确实需要更改一些Java代码。我删除了筛选器并执行了“stateQuery.setProperties(primaryKey)”,而不是filter.setProperty()。谢谢你的指导。
[DEBUG AST:223] --- HQL AST ---
 \-[QUERY] 'query'
    +-[SELECT_FROM] 'SELECT_FROM'
    |  \-[FROM] 'from'
    |     \-[RANGE] 'RANGE'
    |        +-[DOT] '.'
    |        |  +-[DOT] '.'
    |        |  |  +-[DOT] '.'
    |        |  |  |  +-[DOT] '.'
    |        |  |  |  |  +-[IDENT] 'com'
    |        |  |  \-[IDENT] 'data'
    |        |  \-[IDENT] 'StateRefData'
    |        \-[ALIAS] 'd'
    \-[WHERE] 'WHERE'
       \-[EQ] '='
          +-[DOT] '.'
          |  +-[IDENT] 'd'
          |  \-[IDENT] 'primaryKey'
          \-[COLON] ':'
             \-[IDENT] 'primaryKey'

[DEBUG AST:193] --- SQL AST ---
 \-[SELECT] QueryNode: 'SELECT'  querySpaces (STATE_REF)
    +-[SELECT_CLAUSE] SelectClause: '{derived select clause}'
    |  +-[SELECT_EXPR] SelectExpressionImpl: 'statere0_.COUNTRY_CODE as COUNTRY1_, statere0_.STATE as STATE' {FromElement{explicit,not a collection join,not a fetch join,fetch non-lazy properties,classAlias=d,role=null,tableName=STATE_REF,tableAlias=statere0_,colums={,className=com.data.StateRefData}}}
    |  \-[SQL_TOKEN] SqlFragment: 'statere0_.DIALING_CODE as DIALING3_60_, statere0_.IS_ACTIVE as IS4_60_, statere0_.LOCALE_CODE as LOCALE5_60_, statere0_.ST_NAME as ST6_60_'
    +-[FROM] FromClause: 'from' FromClause{level=1, fromElementCounter=1, fromElements=1, fromElementByClassAlias=[d], fromElementByTableAlias=[statere0_], fromElementsByPath=[], collectionJoinFromElementsByPath=[], impliedElements=[]}
    |  \-[FROM_FRAGMENT] FromElement: 'STATE_REF statere0_' FromElement{explicit,not a collection join,not a fetch join,fetch non-lazy properties,classAlias=d,role=null,tableName=STATE_REF,tableAlias=statere0_,colums={,className=com.data.StateRefData}}
    \-[WHERE] SqlNode: 'WHERE'
       \-[EQ] SqlNode: '='
          +-[DOT] DotNode: '(statere0_.COUNTRY_CODE, statere0_.STATE)' {propertyName=primaryKey,dereferenceType=2,propertyPath=primaryKey,path=d.primaryKey,tableAlias=statere0_,className=com.data.StateRefData,classAlias=d}
          |  +-[ALIAS_REF] IdentNode: '(statere0_.COUNTRY_CODE, statere0_.STATE)' {alias=d, className=com.data.StateRefData, tableAlias=statere0_}
          |  \-[IDENT] IdentNode: 'primaryKey' {originalText=primaryKey}
          \-[NAMED_PARAM] SqlNode: '?' 
<query name="findState">
    <![CDATA[ from
      com.data.StateRefData
        WHERE primaryKey.countryCode = :countryCode AND primaryKey.state = :state
    ]]>
</query>