Java 将NamedQuery与复合类一起使用
我在映射XML文件中定义了以下类: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" />
<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>