Java mybatis列名冲突?
我在项目中使用MyBatis作为持久层 我在mySql数据库中有两个表,paytransaction和paymenttype,定义如下:Java mybatis列名冲突?,java,mysql,sql,mapping,mybatis,Java,Mysql,Sql,Mapping,Mybatis,我在项目中使用MyBatis作为持久层 我在mySql数据库中有两个表,paytransaction和paymenttype,定义如下: PayTransaction PaymentType Field Field ------------- ------- id payment_state creation_date update_date pa
PayTransaction PaymentType
Field Field
------------- -------
id
payment_state
creation_date
update_date
payment_type ----FK---->id
payment_id description
因此,paytransaction通过payment_type列(外键)关联paymenttype
我的映射器的定义如下:
PayTransaction PaymentType
Field Field
------------- -------
id
payment_state
creation_date
update_date
payment_type ----FK---->id
payment_id description
支付交易
<resultMap id="payTransactionPaymentTypeResultMap" type="com.XXX.payplatform.model.to.impl.TOPayTransaction" >
<id column="id" property="id" javaType="long"/>
<result column="payment_state" property="payment_state" javaType="string"/>
<result column="creation_date" property="creation_date" javaType="date"/>
<result column="update_date" property="update_date" javaType="date"/>
<result column="payment_id" property="payment_id" javaType="long"/>
<association column="payment_type" property="paymentType" javaType="com.XXX.payplatform.model.to.impl.TOPaymentType" resultMap="com.XXX.payplatform.model.dao.interfaces.IDAOPaymentType.paymentTypeResultMap"/>
</resultMap>
付款类型
<resultMap id="paymentTypeResultMap" type="com.XXX.payplatform.model.to.impl.TOPaymentType" >
<id column="id" property="id" javaType="long"/>
<result column="description" property="description" javaType="string"/>
</resultMap>
SQL JOIN语句是:
<sql id="joinPayTransactionPaymentType">
select paytransaction.id, paytransaction.payment_state, paytransaction.creation_date,paytransaction.update_date, paytransaction.payment_id,
paymenttype.id, paymenttype.description
from paytransaction
INNER JOIN paymenttype ON paymenttype.id = paytransaction.payment_type
</sql>
选择paytransaction.id、paytransaction.payment\u状态、paytransaction.creation\u日期、paytransaction.update\u日期、paytransaction.payment\u id、,
paymenttype.id,paymenttype.description
从付费交易
paymenttype.id=paytransaction.payment\u类型上的内部联接paymenttype
paytransaction和paymenttype表中名为“id”的列都会出现问题。在映射对象时,相同的值会进入ids字段,即如果paytransaction的id为39,则映射后java对象中paymenttype的id在db中为3时也将为39
我试过写alias,比如:
<sql id="joinPayTransactionPaymentType">
select paytransaction.id AS "paytransaction.id", paytransaction.payment_state as payment_state, paytransaction.creation_date as creation_date,paytransaction.update_date as update_date, paytransaction.payment_id as payment_id,
paymenttype.id AS "paymenttype.id", paymenttype.description as description
from paytransaction
INNER JOIN paymenttype ON paymenttype.id = paytransaction.payment_type
</sql>
选择paytransaction.id作为“paytransaction.id”,paytransaction.payment\u状态作为payment\u状态,paytransaction.creation\u日期作为creation\u日期,paytransaction.update\u日期作为update\u日期,paytransaction.payment\u id作为payment\u id,
paymenttype.id为“paymenttype.id”,paymenttype.description为描述
从付费交易
paymenttype.id=paytransaction.payment\u类型上的内部联接paymenttype
但没有结果。我认为唯一可行的解决方案是更改db中列的名称,如“paymenttype_id”和“paytransaction_id”
是否有任何解决方案,或者这是一个mybatis错误
谢谢 对于MyBatis来说,具有相同的属性名称不是问题,只要您能够将确定的列(或列别名)映射到这些属性。为结果列提供别名时,也应为
paymentTypeResultMap
提供相同的列名。那就行了
<resultMap id="payTransactionPaymentTypeResultMap" type="com.XXX.payplatform.model.to.impl.TOPayTransaction" >
<id column="id" property="id" javaType="long"/>
<result column="payment_state" property="payment_state" javaType="string"/>
<result column="creation_date" property="creation_date" javaType="date"/>
<result column="update_date" property="update_date" javaType="date"/>
<result column="payment_id" property="payment_id" javaType="long"/>
<association column="payment_type" property="paymentType" javaType="com.XXX.payplatform.model.to.impl.TOPaymentType" resultMap="com.XXX.payplatform.model.dao.interfaces.IDAOPaymentType.paymentTypeResultMap"/>
</resultMap>
选择paytransaction.id,paytransaction.payment\u状态作为payment\u状态,paytransaction.creation\u日期作为creation\u日期,paytransaction.update\u日期作为update\u日期,paytransaction.payment\u id作为payment\u id,
paymenttype.id作为paymenttype\u id,paymenttype.description作为描述
从付费交易
paymenttype.id=paytransaction.payment\u类型上的内部联接paymenttype
谢谢Yigitalp!但是如果我理解正确,我需要更改db中的paymenttype“id”列,然后更改映射器中的列定义,对吗?这里的问题是paymenttype和paytransaction“id”列都被命名为“id”。我的意思是,这不是属性冲突,而是列名冲突。对不起,我编辑了标题。您不需要在DB中更改列的名称。您可以编写类似“选择id作为paymenttype\u id FROM paymenttype”的查询。这解决了列名冲突。MyBatis不需要知道列的“真实”名称,重要的是来自查询的结果集。“joinPayTransactionPaymentType”sql将返回'paymenttype.id'作为'paymenttype_id';'paytransaction.id'作为'id'。然后MyBatis将“paymenttype_id”映射到“TopPaymentType”对象中的“id”字段“TOPayTransaction”对象中的“id”到“id”字段。您好!谢谢你的回复。但是我正在这样做,我得到了映射错误。嗨,也许你可以用你得到的错误更新这个问题。
<sql id="joinPayTransactionPaymentType">
select paytransaction.id, paytransaction.payment_state as payment_state, paytransaction.creation_date as creation_date,paytransaction.update_date as update_date, paytransaction.payment_id as payment_id,
paymenttype.id AS paymenttype_id, paymenttype.description as description
from paytransaction
INNER JOIN paymenttype ON paymenttype.id = paytransaction.payment_type
</sql>