Bre*_*ret 4 regex sql oracle hibernate seam
我正在尝试实现一个接受字符串列表的Web服务,每个字符串都是一个正则表达式.这些需要与数据库的六列进行比较,并且需要返回任何匹配的行.
我相信Oracle有一个我可以使用的regexp_like()函数,但是我正在寻找使用Hibernate 的最佳方法,所以我不反对持久性引擎.
我从这样开始,其中参与者集合包含正则表达式:
List<Message> messages = new ArrayList<Message>();
List<Message> m1 = ((Session) entityManager.getDelegate())
.createCriteria(MessageSSR.class).add(Restrictions.or(
Restrictions.in("Node2Id", participants),
Restrictions.in("Node2Id", participants))).list();
List<Message> m2 = ((Session) entityManager.getDelegate())
.createCriteria(MessageSSR.class).add(Restrictions.or(
Restrictions.in("Node3Id", participants),
Restrictions.in("Node4Id", participants))).list();
List<Message> m3 = ((Session) entityManager.getDelegate())
.createCriteria(MessageSSR.class).add(Restrictions.or(
Restrictions.in("Node5Id", participants),
Restrictions.in("Node6Id", participants))).list();
messages.addAll(m1);
messages.addAll(m2);
messages.addAll(m3);
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为"in"不会做我想要的,这似乎不告诉Hibernate使用正则表达式匹配.
这是我提出的唯一答案,但看起来很难看:
List<Message> messages = new ArrayList<Message>();
for (String re : participants) {
List<Message> m1 = ((Session) entityManager.getDelegate())
.createCriteria(MessageSSR.class)
.add(Restrictions.or(
Restrictions.sqlRestriction("regexp_like(NODE_1, " + re + ")"),
Restrictions.sqlRestriction("regexp_like(NODE_2, " + re + ")")
)).list();
List<Message> m2 = ((Session) entityManager.getDelegate())
.createCriteria(MessageSSR.class)
.add(Restrictions.or(
Restrictions.sqlRestriction("regexp_like(NODE_3, " + re + ")"),
Restrictions.sqlRestriction("regexp_like(NODE_4, " + re + ")")
)).list();
List<Message> m3 = ((Session) entityManager.getDelegate())
.createCriteria(MessageSSR.class)
.add(Restrictions.or(
Restrictions.sqlRestriction("regexp_like(NODE_5, " + re + ")"),
Restrictions.sqlRestriction("regexp_like(NODE_6, " + re + ")")
)).list();
messages.addAll(m1);
messages.addAll(m2);
messages.addAll(m3);
}
Run Code Online (Sandbox Code Playgroud)
我正试图将尽可能多的东西推到Oracle上.这个appraoch似乎可行,但是在不使用参数的情况下实施限制意味着我失去了很多潜在的效率.任何人都可以看到更好的方法吗?为简单起见,我相信传递给我的正则表达式.
hibernate文档中没有任何内容用于执行正则表达式查询(使用HQL或Criteria查询).sqlRestrictions应该将使用the的方法更改为其中一个重载方法,以避免SQL注入漏洞.
示例代码:
Restrictions.sqlRestriction("regexp_like({alias}.NODE_1, ?)", re, Hibernate.STRING)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7949 次 |
| 最近记录: |