首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ibatis中的动态查询

Ibatis中的动态查询
EN

Stack Overflow用户
提问于 2010-06-29 08:10:56
回答 3查看 3.2K关注 0票数 0

是否有可能将动态查询传递给Ibatis并从中获取记录?

例如,我使用StringBuilder构建了我的查询,最后,我得到了以下查询“选择emp_id,从employee where emp_id==1中选择emp_name”。现在,我需要将这个完整的查询传递给Ibatis并获得记录。

注意:这里的列数和条件在每个查询形式上都会有所不同

编辑:如何将查询传递给ibatis并让它使用Ibatis执行?

EN

回答 3

Stack Overflow用户

发布于 2010-06-29 14:49:34

我不认为你可以,即使你可以,你也不应该那样做。“使用StringBuilder构建查询”违背了iBatis的目的,并且容易出现许多问题(其中有SQL),而iBatis正是为了防止这些问题而设计的。

帮你自己一个忙:阅读关于iBatis中的动态查询的文章,并把你的iBatis从Java中拿出来(如果你真的想使用iBatis)。

如果你真的坚持..。好吧,我想您可以将整个sql查询作为一个字符串传递给iBatis,例如调用动态执行该sql代码的存储过程。可怕但可以想象。

票数 1
EN

Stack Overflow用户

发布于 2010-06-29 08:21:11

MyBatis和SelectBuilder和SQLBuilder一起来了。可以使用此SelectBuilder构造动态查询。有关SelectBuilder的更多信息可以在用户指南中找到。

票数 0
EN

Stack Overflow用户

发布于 2012-03-19 16:35:11

老问题,但我想插话。我同意@leonbloy,ibatis提供了一些特性,以避免您想要做的事情。动态查询的ib提斯链接应该可以帮助您解决这个问题。

下面是我使用过的一个简单示例:

有一个将参数作为字典传递的方法

代码语言:javascript
复制
public IList<ITraceLogRecord> GetTraceLogRecords(string systemType, string plantName, int? deviceId, DateTime startTime, DateTime endTime, string logDescription, string loggerName, List<int> traceLevelIds)
    {
        IDictionary<string, object> traceQueryParameters = new Dictionary<string, object>();
        traceQueryParameters.Add("deviceId", deviceId);
        traceQueryParameters.Add("startTime", startTime);
        traceQueryParameters.Add("endTime", endTime);
        traceQueryParameters.Add("logDescription", logDescription);
        traceQueryParameters.Add("loggerName", loggerName);
        traceQueryParameters.Add("traceLevelIds", traceLevelIds);

        return DataSources.GetDbConnectionName(systemType, plantName).QueryForList<ITraceLogRecord>("SelectTraceLogRecords", traceQueryParameters);
    }

创建select语句并检查输入是否为null,以确定是否将它们包含在where子句:

代码语言:javascript
复制
<select id="SelectTraceLogRecords" parameterClass="System.Collections.IDictionary" resultMap="TraceLogRecordMap">
  SELECT TraceLevelId, Trace, DeviceId, LoggerName, CreatedTimeStamp, ThreadId
  FROM Trace
  <dynamic prepend="WHERE">
    <isNotNull prepend="AND" property="deviceId">
      DeviceId = #deviceId#
    </isNotNull>
    <isNotNull prepend="AND" property="startTime">
      CreatedTimeStamp >= #startTime#
    </isNotNull>
    <isNotNull prepend="AND" property="endTime">
      <![CDATA[CreatedTimeStamp <= #endTime#]]>       
    </isNotNull>
    <isNotNull prepend="AND" property="logDescription">
      Trace LIKE #logDescription#
    </isNotNull>
    <isNotNull prepend="AND" property="loggerName">
      LoggerName LIKE #loggerName#
    </isNotNull>
    <isNotNull prepend="AND" property="traceLevelIds">
      <iterate property="traceLevelIds" open="(" close=")" conjunction="OR">
        TraceLevelId = #traceLevelIds[]#
      </iterate>
    </isNotNull>
  </dynamic>
</select>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3138912

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档