Здравствуйте, Аноним, Вы писали:
А>Подскажите, может есть какие готовые инструменты, позволяющие упростить решение задачи и не писать свой парсер для criteria?
Здравствуйте, Victor Repetsky, Вы писали:
VR>Здравствуйте, Аноним, Вы писали:
А>>Подскажите, может есть какие готовые инструменты, позволяющие упростить решение задачи и не писать свой парсер для criteria?
VR>Оно?
Совершенно не оно :( У меня нет XML, у меня простые бины, и мне всего лишь нужно знать, какие из них удовлетворяют набору ограничений, а какие нет. Грубо говоря:
public class MyBean {
String name;
int length;
public MyBean(String name, int length) {
this.name = name;
this.length = length;
}
public int getLength() {
return length;
}
public String getName() {
return name;
}
}
И еще есть List<MyBean>, по которому мне надо написать аналог
select * from list where ((name like "X%") or (name="XXX" and length=12))
Задействовать СУБД, даже встараиваемую, очень не хочется
А>Совершенно не оно У меня нет XML, у меня простые бины, и мне всего лишь нужно знать, какие из них удовлетворяют набору ограничений, а какие нет. Грубо говоря:
А>
А>public class MyBean {
А> String name;
А> int length;
А> public MyBean(String name, int length) {
А> this.name = name;
А> this.length = length;
А> }
А> public int getLength() {
А> return length;
А> }
А> public String getName() {
А> return name;
А> }
А>}
А>
А>И еще есть List<MyBean>, по которому мне надо написать аналог
А>
А>select * from list where ((name like "X%") or (name="XXX" and length=12))
А>
XML там не нужен. Читайте внимательней.
JXPath provides APIs for traversal of graphs of JavaBeans, DOM and other types of objects using the XPath syntax.
Этот пример будет примерно так
List<MyBean> list = ...;
JXPathContext context = JXPathContext.newContext( list );
Iterator it = context.iterate(".[(starts-with(@name,'X') or (@name='XXX' and @length = 12 )]");
while(it.hasNext()) {
MyBean m = (MyBean)it.next();
}
А>Строка criteria может выглядеть примерно так:
А>
А>((name like "X%") or (name="XXX" and length=12))
А>
А>name и length — свойства соответствующего бина
А>Подскажите, может есть какие готовые инструменты, позволяющие упростить решение задачи и не писать свой парсер для criteria?
А>Во избежание совета пользоваться HQL скажу, что к БД задача не имеет никакого отношения
VR>List<MyBean> list = ...;
VR>JXPathContext context = JXPathContext.newContext( list );
VR>Iterator it = context.iterate(".[(starts-with(@name,'X') or (@name='XXX' and @length = 12 )]");
VR>while(it.hasNext()) {
VR> MyBean m = (MyBean)it.next();
VR>}
VR>
Не работает даже так:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.apache.commons.jxpath.JXPathContext;
public class JXPathTest {
static private class MyBean {
String name;
int length;
public MyBean(String name, int length) {
this.name = name;
this.length = length;
}
public int getLength() {
return length;
}
public String getName() {
return name;
}
public String toString() {
return"MyBean : "+name+", "+(new Integer(length).toString());
}
}
public static void main(String[] args) {
List<MyBean> list = new ArrayList<MyBean>();
list.add(new MyBean("XYZ", 1));
JXPathContext context = JXPathContext.newContext(list);
Iterator it = context.iterate(".[@length=1]");
while(it.hasNext()) {
MyBean m = (MyBean)it.next();
System.out.println(m);
}
}
}
Ничего не выводится. А если использовать приведенное вами выражение, то я получу:
Exception in thread "main" org.apache.commons.jxpath.JXPathException: Invalid XPath: '.[((starts-with(@name,\'X\') or (@name=\'XXX\' and @length=12)]'. Syntax error after: '.['
at org.apache.commons.jxpath.ri.Parser.parseExpression(Parser.java:60)
at org.apache.commons.jxpath.ri.JXPathContextReferenceImpl.compileExpression(JXPathContextReferenceImpl.java:218)
at org.apache.commons.jxpath.ri.JXPathContextReferenceImpl.iterate(JXPathContextReferenceImpl.java:384)
at JXPathTest.main(JXPathTest.java:32)
Т.е. есть подозрение, что starts-with просто не реализован.
Или я делаю что-то не так?
Re[5]: Встроенный интерпретатор
От:
Аноним
Дата:
21.04.06 07:02
Оценка:
А> static private class MyBean {
Не очень ясно почему, но MyBean должен быть public
А>
А>Exception in thread "main" org.apache.commons.jxpath.JXPathException: Invalid XPath: '.[((starts-with(@name,\'X\') or (@name=\'XXX\' and @length=12)]'. Syntax error after: '.['
А> at org.apache.commons.jxpath.ri.Parser.parseExpression(Parser.java:60)
А> at org.apache.commons.jxpath.ri.JXPathContextReferenceImpl.compileExpression(JXPathContextReferenceImpl.java:218)
А> at org.apache.commons.jxpath.ri.JXPathContextReferenceImpl.iterate(JXPathContextReferenceImpl.java:384)
А> at JXPathTest.main(JXPathTest.java:32)
А>
А>Т.е. есть подозрение, что starts-with просто не реализован.
А как решить эту проблему?
Re[6]: Встроенный интерпретатор
От:
Аноним
Дата:
21.04.06 10:26
Оценка:
А> .[((starts-with(@name,'X') or (@name='XXX' and @length=12)]'
Здесь просто лишняя открывающая скобка
Но есть еще одна проблема:
List<MyBean> list = new ArrayList<MyBean>();
list.add(new MyBean("X1", 1));
list.add(new MyBean("X2", 2));
JXPathContext context = JXPathContext.newContext(list);
Iterator it = context.iterate(".[starts-with(@name,'X')]");
while(it.hasNext()) {
MyBean m = (MyBean)it.next();
System.out.println(m);
}
it = context.iterate(".[@name='X1']");
while(it.hasNext()) {
MyBean m = (MyBean)it.next();
System.out.println(m);
}
Первый цикл выводит оба бина, второй — ни одного. Почему?
Еще вопрос: как получить name второго по порядку бина? context.getValue("@name") выводит name первого, попытки использовать [] ни к чему не привели
А>Первый цикл выводит оба бина, второй — ни одного. Почему?
Пиши просто name
context.iterate(".[name='X1']");
(почему — здесь).
А>Еще вопрос: как получить name второго по порядку бина? context.getValue("@name") выводит name первого, попытки использовать [] ни к чему не привели