$ dbc
возвращает false. В вашем запросе есть ошибка:
Пользователь SELECT. *, Профиль. * - Вы не присоединяетесь к профилю в любом месте. FROM users INNER JOIN contact_info ON contact_info.user_id = users.user_id WHERE users.user_id = 3 ");
Исправление для этого вообще описано Raveren.
Вот пример использования стандартной (Java 1.6+) скриптовой библиотеки:
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
public class Test {
public static void main(String[] args) throws Exception {
ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName("JavaScript");
engine.eval("value = 10");
Boolean greaterThan5 = (Boolean) engine.eval("value > 5");
Boolean lessThan5 = (Boolean) engine.eval("value < 5");
System.out.println("10 > 5? " + greaterThan5); // true
System.out.println("10 < 5? " + lessThan5); // false
}
}
Для оценки условий с максимальной гибкостью используйте язык сценариев, предназначенный для встраивания, например MVEL может анализировать и оценивать простые условные выражения, подобные тем, которые заданы в вопросе.
Использование MVEL обладает огромным преимуществом по сравнению с использованием механизма Scripting в Java 1.6+ (в частности, с JavaScript): с MVEL вы можете скомпилировать скрипты для байт-кода, делая их оценку намного более эффективной во время выполнения.
Вы должны попробовать разбор строки внутри оператора if, выполнив что-то вроде
if(parseMyString(getValue()))
doSomething();
. В parseMyString можно определить, что вам нужно оценить для условия. Если вы не знаете, как создать парсер, посмотрите на: http://www.javapractices.com/topic/TopicAction.do?Id=87
Это не отвечает на ваш вопрос сам по себе; он предлагает альтернативное решение, которое может повлиять на тот же результат.
Вместо хранения отдельного столбца базы данных с псевдокодом, который определяет условие, создайте таблицу, в которой схема определяет типы условий, которые должны быть удовлетворены, и значения этих условий. Это упрощает программную оценку этих условий, но может оказаться сложным, если у вас есть множество типов условий для оценки.
Например, у вас может быть таблица, которая выглядит следующим образом.
CONDITION_ID | MINIMUM | MAXIMUM | IS_PRIME | ETC.
______________________________________________________
1 | 2 | NULL | NULL | ...
2 | 4 | 6 | NULL | ...
Эти записи строк, соответственно, соответствуют правилам value > 2
и 6 > value > 4
.
Это дает ряд преимуществ по сравнению с вашим подходом.
Это не будет тривиально: вам нужен синтаксический анализатор языка выражения, используемого в вашей базе данных. Если это стандартный, хорошо определенный язык, то вы можете найти его в Интернете, но если это внутренняя вещь, вам может понадобиться написать свой собственный (возможно, используя генератор парсера, такой как ANTLR.)
Пакет javax.script содержит некоторые инструменты для интеграции внешних скриптовых движков, таких как Javascript-интерпретатор. Альтернативная идея заключалась бы в создании механизма сценариев и подачи выражений на это.
Последняя версия java (Java 7) позволяет операторам операторов switch в Strings, если вариантов не так много, вы могли бы просто сделать это или подобное:
int value = getValue();
Switch(myString) {
Case "value > 2" : if (value > 2) { doSomething();} break;
Case "4 < value < 6" : if (4 < value < 6) { doSomethingElse();} break;
default : doDefault();
}
Очень хороший способ сделать это, помимо использования Java 7, - использовать перечисления. Объявить перечисление, как показано ниже
Вышеприведенное перечисление содержит набор констант, значения которых установлены на строки, которые вы ожидаете, будут возвращены из базы данных. Поскольку вы можете использовать перечисления в случаях переключения, оставшийся код становится легким.
enum MyEnum
{
val1("value < 4"),val2("4<value<6");
private String value;
private MyEnum(String value)
{
this.value = value;
}
}
public static void chooseStrategy(MyEnum enumVal)
{
int value = getValue();
switch(enumVal)
{
case val1:
if(value > 2){}
break;
case val2:
if(4 < value && value < 6) {}
break;
default:
}
}
public static void main(String[] args)
{
String str = "4<value<6";
chooseStrategy(MyEnum.valueOf(str));
}
Все, что вам нужно сделать, это передать вашу строку методу enum.valueof и вернуть возвратное перечисление, которое помещается в блок блокировки выключателя для выполнения условного режима. В приведенном выше коде вы можете передать любую строку вместо того, что было передано в этом примере
Вы в основном оцениваете скриптовое выражение.
Я предполагаю, что вы смотрите на простой пример, где выражение: [border0] [operator] "value" [operator] [border1]
Если одна, но не обе группы [границы] [оператора], могут быть опущены. (И если оба являются подарками, оператор должен быть тем же самым)
Я бы использовал регулярное выражение для этого с захватными группами.
Что-то вроде: (?: (\ D +) \ s * ([& lt;>]) \ s *)? value (?: \ s * ([& lt;>]) \ s * (\ d +))?
И затем: border1 = group (1); operator1 = группа (2); operator2 = группа (3); border2 = группа (4)
engine
имеет значение null. Вы используете Java 1.6+? Нет опечатки в имени двигателя: «JavaScript» с верхним регистром J и S? – assylias 7 June 2012 в 09:01