Я пытаюсь получить новую оценку от оператора UPDATE в Java
int userID = 99;
String sql = "UPDATE table SET rating=rating+1 WHERE user_REF="+userID;
statement.executeUpdate(sql);
Я могу просто сделать другой оператор SELECT, но не являюсь там лучшим способом получить значение или строку при обновлении?
В MySQL:
$query1 = 'UPDATE `table` SET rating = (@rating:= rating) + 1 WHERE id = 1';
$query2 = 'select @rating';
всем спасибо за ответы, в итоге я сделал это вот так :
int userID = 99;
String sql = "SELECT id, rating FROM table WHERE user_REF="+userID;
ResultSet rs = statement.executeQuery(sql);
rs.first();
float oldRating = rs.getFloat("rating");
float newRating = oldRating +1;
rs.updateFloat("rating", newRating);
rs.updateRow();
return newRating;
таким образом он (или, по крайней мере, так кажется) выполняет только один запрос, чтобы найти правильную строку, или я ошибаюсь?
Поскольку attr _ accessors
не имеет ничего общего с тем, как ActiveRecord обрабатывает столбцы. Я показал это в этот вопрос . В основном все вещи, происходящие в поисковиках, которые касаются столбцов, работают с хэшем attributes
, а не с переменными экземпляра, которые объявляют пользователи доступа.
изменить: на самом деле мой ответ не отвечает полностью на вопрос. это просто объясняет, почему attr _ access
не может быть никакой помощи здесь. с нетерпением ждем, когда кто-то выполнит оставшуюся часть работы:)
Можно обернуть java.util.Random
в компонент и использовать jsp: useBean
.
package com.example;
import java.util.Random;
public class RandomBean {
private static final Random RANDOM = new Random();
public int getNextInt() {
return RANDOM.nextInt();
}
}
... чтобы вы могли использовать его в своем JSP следующим образом:
<jsp:useBean id="random" class="com.example.RandomBean" scope="application" />
...
<div class="${random.nextInt % 2 == 0 ? 'redlogo' : 'greenlogo'}">
(обратите внимание, что я оптимизировал c: выбрать
подальше с помощью троичного оператора).
Будьте осторожны в том, что большинство решений зависит от базы данных (независимо от того, хотите ли вы независимости базы данных в вашем приложении, имеет значение).
Еще одно решение, которое вы можете попробовать, это написать процедуру и выполнить ее следующим образом
my_package.updateAndReturnRating(refId, cursor record).
Конечно, это может/не может сделать само решение сложным, но стоит "оценки" по крайней мере.
Короче говоря, нет, нет способа сделать это с помощью стандартного ANSI SQL.
У вас есть три варианта:
1) Сделать это в двух запросах - обновление, затем select
2) Создать хранимую процедуру, которая выполнит обновление, а затем вернет select
3) Использовать расширение для конкретной СУБД, например, предложение PostgreSQL RETURNING
Обратите внимание, что варианты 2) и 3) зависят от конкретной базы данных.
В PostgreSQL есть пункт RETURNING
См .: http://www.postgresql.org/docs/8.3/interactive/sql-update.html