是否有一种简单的方法可以从 jdbc 出站网关外部化大型 SQL 查询,而不是内联它?原因是我们必须进行许多大型查询,并且我们希望将它们放在自己的文件中,或者至少将它们外部化在 beans 中。
一些注意事项:
- 我无法控制数据库,因此无法创建任何内容 那里(例如存储过程)
- 我不想仅仅为了这个问题创建类,我只是想稍微组织/重构它,而不是让它变得更复杂 引入许多其他步骤
- 我更喜欢创建裸 .sql 文件,但将查询放入带有 bean 的 xml 中也可以
- 我无法选择使用 hibernate,只能使用 spring 集成 jdbc
考虑到我们将有许多其他出站网关,欢迎提出有关如何更好地组织此 Activity 的建议:)
例如,我不希望将 SQL 内联到“int-jdbc:outbound-gateway”元素中,如下所示:
<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>
它也适用于 bean 内部使用的“:payload”参数。
最佳答案
是的,您可以将它们放入属性文件中,并使用属性占位符 ${...}
来解决它们,或者您可以使用 SpEL...
"#{myQueryBean.queryOne}"
哪里myQueryBean
是 <bean/>
这是一个带有方法的类的实例...
public String getQueryOne() {...}
或者类中的静态常量...
"#{T(foo.Queries).QUERY_ONE}"
public static final String QUERY_ONE = "...";
关于java - Spring Integration - 外部化 JDBC 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25556825/