我试图找出使用MyBatis 3.0.6解决以下问题的方法:
我需要根据一系列参数构建动态select语句,其中一个参数类型HashMap<String, List<String>>.挑战在于弄清楚如何使MyBatis迭代外部foreach循环中的所有键,以及迭代内部循环中值列表的元素.
为了说明,假设我的名为filter的哈希映射参数包含每个国家的状态(状态代码列表,每个列表是值)(国家代码作为键),如下所示:
'US' -> {'CO','NY','MI','AZ'};
'CA' -> {'ON','BC','QC'}
Run Code Online (Sandbox Code Playgroud)
我需要我的动态SQL看起来像这样(以简化的形式):
SELECT *
FROM Table1
WHERE ... some static criteria goes here...
AND RowId IN (SELECT RowId FROM Table2 WHERE Country = 'US' AND State IN ('CO','NY','MI','AZ')
AND RowId IN (SELECT RowId FROM Table2 WHERE Country = 'CA' AND State IN ('ON','BC,'QC')
Run Code Online (Sandbox Code Playgroud)
我想我的mapper XML应该是这样的:
<select id="getData" resultType="QueryResult">
SELECT *
FROM Table1
WHERE ... some static criteria goes here...
<if test="filter != null">
<foreach …Run Code Online (Sandbox Code Playgroud) 我正在努力找到将UserAuthSession对象的当前实例(从ServiceStack派生AuthUserSession)注入我的数据访问存储库的正确方法,以便它们在插入/更新/删除操作上自动更新更改跟踪字段.
如果我在我的服务代码中新建了存储库,那将是一个明智的选择,我会这样做:
var repo = new MyRepository(SessionAs<UserAuthSession>());
Run Code Online (Sandbox Code Playgroud)
但是,我的存储库是自动连接(注入)到服务中的,所以UserAuthSession必须从为存储库注册IOC容器定义的lambda中的某个位置抓取,例如:
public class AppHost : AppHostBase
{
public override void Configure(Container container)
{
container.Register<ICacheClient>(new MemoryCacheClient());
container.Register<IRepository>(c =>
{
return new MyRepository(**?????**); <-- resolve and pass UserAuthSession
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在,查看Service该类的ServiceStack代码:
private object userSession;
protected virtual TUserSession SessionAs<TUserSession>()
{
if (userSession == null)
{
userSession = TryResolve<TUserSession>(); //Easier to mock
if (userSession == null)
userSession = Cache.SessionAs<TUserSession>(Request, Response);
}
return (TUserSession)userSession;
}
Run Code Online (Sandbox Code Playgroud)
我可以看到它根据当前Request和查找缓存的会话Response …
注意:这与处理ServiceStack和WebAPI之间选择的几个问题不重复.
我试图决定在ASP.NET Web应用程序中使用ServiceStack的程度:
选项A:通过抛弃MVC控制器并使用基于ServiceStack的服务和Razor视图替换它们来全力以赴的ServiceStack.
选项B:使用支持ServiceStack的MVC控制器以获得更好的性能和可伸缩性.
A的明显优势是它在构造我的视图时提供了额外的灵活性.但是,我关心两件事:
与MVC控制器处理的纯C#对象相比,ServiceStack执行的对JSON或Xml的请求/响应DTO的所有序列化/反序列化都将以性能为代价.
在处理复杂的对象图时,序列化可能有点不稳定.例如,在涉及循环引用的情况下,Parent.Child <-> Child.Parent必须使用IgnoreDataMember属性,否则序列化将打击堆栈.此外,有时反序列化可能会产生难以诊断的模糊"对象引用未设置"错误.
有没有人对这种困境有任何想法?