是否有一种简单的方法可以从jdbc出站网关外部化大sql查询,而不是内联它?原因是我们需要进行许多大型查询,并且我们希望将它们放在自己的文件中,或者至少将它们外部化为bean。
一些警告:
关于如何更好地组织这个的建议,考虑到我们将有许多其他出站网关,欢迎:)
例如,我不想在" int-jdbc:outbound-gateway"中使用SQL内联。要素如下:
<int-jdbc:outbound-gateway
data-source="datasource"
request-channel="reqChannel"
reply-channel="respChannel"
row-mapper="datamapper" max-rows-per-poll="1000"
query=" SELECT Field1, Field2, ManyOthers
FROM Table T
JOIN A ON A.id = T.id [... many other joins here ...]
WHERE SOMECONDITION=:payload">
</int-jdbc:outbound-gateway>
简单地:
<bean id="myCoolQuery" class="java.lang.String">
<constructor-arg>
<value>
<![CDATA[
SELECT Field1, Field2, ManyOthers
FROM Table T
JOIN A ON A.id = T.id [... many other joins here ...]
WHERE SOMECONDITION=:payload
]]>
</value>
</constructor-arg>
</bean>
<int-jdbc:outbound-gateway
data-source="datasource"
request-channel="reqChannel"
reply-channel="respChannel"
row-mapper="datamapper" max-rows-per-poll="1000"
query="#{myCoolQuery}">
</int-jdbc:outbound-gateway>
它也适用于&#34;:payload&#34; bean内部使用的参数。
答案 0 :(得分:2)
是的,您可以将它们放在属性文件中,并使用属性占位符${...}
来解决它们,或者您可以使用SpEL ...
"#{myQueryBean.queryOne}"
其中myQueryBean
是<bean/>
,它是带有方法的类的实例...
public String getQueryOne() {...}
或类上的静态常量......
"#{T(foo.Queries).QUERY_ONE}"
public static final String QUERY_ONE = "...";
答案 1 :(得分:2)
您可以将XML中的查询定义为spring beans:
<bean id="exampleQuerySql" class="java.lang.String">
<constructor-arg>
<value>
<![CDATA[
select * from foo
where whatever_ind = 'A'
]]>
</value>
</constructor-arg>
</bean>
使用CDATA,查询文本可以包含换行符,尖括号等,因此它清晰易读,您可以将其直接剪切并粘贴到SQL工具中。
您可以使用SpEL来引用bean。