0

動的クエリをIbatisに渡して、そこからレコードを取得することは可能ですか?

たとえば、StringBuilderを使用してクエリを作成し、最後に次のクエリを取得しました。「select emp_id、emp_name from employee where emp_id==1」。次に、この完全なクエリをIbatisに渡して、レコードを取得する必要があります。

注:ここでは、列の数と条件がクエリの形成ごとに異なります。

編集:クエリをIbatisに渡し、ibatisを使用して実行する方法は?

4

3 に答える 3

1

できるとは思いませんし、できたとしてもやるべきではありません。「StringBuilder を使用してクエリを作成する」ことは、iBatis の目的に反し、iBatis が正確に防止するように設計された多くの問題 (それらの間の SQL インジェクション) が発生する傾向があります。

iBatis の動的クエリについて読んで、Java から XML に SQL を取り出してください (本当に iBatis を使用したい場合)。

あなたが本当に主張するなら... まあ、SQLクエリ全体を単一の文字列としてiBatisに渡すことができると思います。たとえば、そのSQLコードを動的に実行するストアドプロシージャを呼び出します。恐ろしいが考えられる。

于 2010-06-29T14:49:34.693 に答える
0

古い問題ですが、参加したかったのです。@leonbloy に同意します。ibatis は、あなたがやろうとしていることを回避する機能を提供します。動的クエリの ibatis リンクは、それを理解するのに役立ちます。

これが私が使った簡単な例です:

引数を辞書として渡すメソッドを用意する

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 句に含めるかどうかを確認します。

<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>
于 2012-03-19T16:35:11.760 に答える
0

MyBatis には SelectBuilder と SQLBuilder が付属しています。このSelectBuilderを使用して、動的クエリを作成できます。SelectBuilder の詳細については、ユーザー ガイドを参照してください。

于 2010-06-29T08:21:11.360 に答える