sql - How to use regular expressions with Hibernate/Oracle -
i'm trying implement web service accepts list of strings, each of regular expression. these need compared against 6 columns of database, , rows match need returned.
i believe oracle has regexp_like() function might able use, i'm looking best way using hibernate, i'm not working against persistence engine.
i started this, in participants collection contains regular expressions:
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); this doesn't work because "in" won't want, , not appear tell hibernate use regular expression match.
this answer i've come with, looks ugly:
list<message> messages = new arraylist<message>(); (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); } i'm trying push of on oracle can. appraoch seems work, putting restrictions in without using parameters means i'm losing lot of potential efficiency. can see better way this? simplicity, i'm trusting regular expressions being passed me.
there's nothing in hibernate docs performing regular expression queries (using hql or criteria queries). approach using sqlrestrictions should changed 1 of overloaded methods avoid sql injection vulnerability.
example code:
restrictions.sqlrestriction("regexp_like({alias}.node_1, ?)", re, hibernate.string)
Comments
Post a Comment