如何从 SQL Query 映射两个变量 - MyBatis

How to map two variables from SQL Query - MyBatis

所以,我在下面有这个 select 查询,它连接两个 table 并检索一个字符串:

<select id =“getAppVerByConfId” parameterType=“java.lang.String” resultType=“java.lang.String”>
SELECT t.app_ver
FROM 
 application a 
   JOIN transaction t on  t.txn_id = a.txn_id
WHERE 
a.confirmation_id = #{0}
</select>

然后我用它作为模板编写了第二个查询,它几乎相同,但只是从 table 中检索了一个不同的参数。

<select id =“getStepNameByConfId” parameterType=“java.lang.String” resultType=“java.lang.String”>
SELECT t.step_name
FROM 
application a 
JOIN transaction t on  t.txn_id = a.txn_id 
WHERE
a.confirmation_id = #{0}

这两个单独使用都很好,而且它们在程序中的同一位置使用。但是肯定有比这更好的方法吗?我应该能够进行一次查询,然后将结果映射到我想要的,对吗?我应该制作一个结果集,然后能够将它们拉出来吗?也许作为一个 HashMap,我可以通过键检索值?在这种情况下我可以使用 AS 运算符吗?即 "SELECT t.app_ver AS appVersion"?不过,我的想法是将变量传递到查询中,而不是将它们取出来?

如果对此有任何想法,我很想听听。我基本上是在尝试将这些组合成一个查询,我需要能够检索正确的值而不是将 app_ver 分配给 step_name,反之亦然。

干杯

正如您所说,在您的 select 中使用别名 (t.app_ver as appVersion) 是个不错的主意,但它只是将要映射的列的名称。因此,如果您使用别名作为下一个 t.app_ver as appVersion, t.step_name as stepName,您的列名将是 appVersionstepName.

然后,要映射您的结果,您有多种选择将其映射到 map 结构中的想法不错,而且很简单,您只需将结果类型设置为 hashmap,它会是这样的(它不需要任何 Resultmap):

哈希图

(Example in offical page)

<select id="selectPerson" parameterType="int" resultType="hashmap">
  SELECT * FROM PERSON WHERE ID = #{id}
</select>

列将是映射中的键,行值是映射中的值。

keyed by column names mapped to row values

因此,要获取您的值,您需要使用列名称作为映射中的键:

String appVersionValue = map.get("appVersion");

结果图

另一种方法是使用您需要映射的属性创建 class,然后创建您的 resultmap

结果图定义如下:

resultMap – The most complicated and powerful element that describes how to load your objects from the database result sets.

你的 class 会是这样的:

public class Application{

   private String appVersion;
   private String stepName;

   //.... getters and setters

}

并且您的结果映射会将列名称映射到 class 属性,指定类型并为此创建 class(在本例中为 Application):

<resultMap id="applicationResultMap" type="Application">
  <result property="appVersion" column="appVersion"/>
  <result property="stepName" column="stepName"/>
</resultMap>

(注意,因为在此示例中,列和属性被称为相等,所以在某些情况下,列被称为 app_version,例如 属性 appVersion,因此会有 <result property="appVersion" column="app_version"/>

最后在你的 select 中你指定使用这个 resultmap:

<select id="selectMethodName" resultMap="applicationResultMap">
  select t.app_ver as appVersion, t.step_name as stepName
  from your_table
</select>