微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

NHibernate HQL查询用于收集具有多个匹配值的值

如何解决NHibernate HQL查询用于收集具有多个匹配值的值

|| 我正在尝试为具有值(字符串)集合的实体编写HQL(NHibernate 3.0)查询。简化得多的实体:
public class Entity {
  public int Id { get; protected set;}
  public OtherEntity OtherEntity { get; set; }
  public IList<string> SomeValues { get; set; }
}
我希望能够找到所有实体实例,其中SomeValues中的任何字符串都可以使用\“以matchs开头\”来匹配一组输入字符串中的任何一个。当使用NH LINQprovider时,我可以使用以下查询来做我想做的事情:
from entity in session.Query<Entity>() 
where entity.someValues.Any(val =>
  val.StartsWith(\"matchVal1\") || val.StartsWith(\"matchVal2\"))
select entity
显然,这种构建查询的方式不支持任意数量的参数,但我通过使用System.Linq.Expressions命名空间动态构建LINQ表达式的一部分来解决了该问题。生成sql对我来说是好的,因为它不包含任何ANY / SOME函数调用sqlite似乎不支持它,我在某些单元测试中使用过),并且仅包含一个EXISTS子查询。 但是,我不能再使用NH LINQ,因为我需要与OtherEntity进行左外连接,并且在NH 3.0(或NH 3.1)中不支持方法。由于Criteria / QueryOver API似乎不支持在所有HQL上对值集合进行过滤,这可能是我唯一的选择,但我无法提出一种编写查询的好方法:我最近的查询是:
select entity from Entity as entity 
where 
  \'matchVal1\' in elements(entity.someValues) or
  \'matchVal2\' in elements(entity.someValues)
上面查询的主要问题是它仅执行相等匹配,而不是类似匹配。我认为这样可以解决问题:
where \'matchVal1%\' like any elements(entity.someValues)
但这甚至不能翻译成sql(引发NHibernate.Hql.Ast.ANTLR.QuerySyntaxException)。另一个问题是上述策略会导致多个子选择。 我尝试进行的搜索对我来说并不奇怪,因此我不禁觉得必须有一个简单的解决方案。另外,确实必须有一种在HQL中编写此查询方法,因为NH LINQ提供程序似乎在生成sql之前将LINQ表达式转换为HQL。也许有一种方法可以检索此中间HQL? 因此,任何有关如何编写HQL查询或如何将LINQ转换为HQL的建议都将受到赞赏。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。