Мне нравится делать это, оценивая записи по некоторым столбцам. В этом случае значения ранга rev
группируются по id
. Те, у кого выше rev
, будут иметь более низкий рейтинг. Таким образом, наивысший rev
будет иметь ранжирование 1.
select id, rev, content
from
(select
@rowNum := if(@prevValue = id, @rowNum+1, 1) as row_num,
id, rev, content,
@prevValue := id
from
(select id, rev, content from YOURTABLE order by id asc, rev desc) TEMP,
(select @rowNum := 1 from DUAL) X,
(select @prevValue := -1 from DUAL) Y) TEMP
where row_num = 1;
Не уверен, что введение переменных делает все это медленнее. Но, по крайней мере, я не дважды запрашиваю YOURTABLE
.
Для этого вам нужно Multibindings . В частности, вы хотите привязать Set<Action>
(а не List
, но Set
, вероятно, вы действительно так хотите):
Multibinder<Action> actionBinder = Multibinder.newSetBinder(binder(), Action.class);
actionBinder.addBinding().to(FooAction.class);
actionBinder.addBinding().to(BarAction.class);
Затем вы можете @Inject
Set<Action>
где угодно.
Позвольте мне показать вам, что я считаю еще лучшим способом многообразий. Если вы хотите, чтобы Action
s были подключаемыми, и пусть кто-нибудь их добавляет, часто бывает полезно предоставить простой Module
для кого-то, кто будет использовать эту шкуру, нуждающуюся в создании экземпляра Multibinder
. Вот пример:
public abstract class ActionModule extends AbstractModule {
private Multibinder<Action> actionBinder;
@Override protected void configure() {
actionBinder = Multibinder.newSetBinder(binder(), Action.class);
configureActions();
}
/**
* Override this method to call {@link #bindAction}.
*/
protected abstract void configureActions();
protected final LinkedBindingBuilder<Action> bindAction() {
return actionBinder.addBinding();
}
}
Теперь почему это лучше? Это позволяет кому-то использовать ActionModule
из любого места, чтобы добавить больше Action
s через стандартный API привязки. Я думаю, что это более читаемо. Вот пример использования:
public final class MyStandardActionModule extends ActionModule() {
@Override protected void configureActions() {
bindAction().to(FooAction.class);
bindAction().to(BarAction.class);
// If you need to instantiate an action through a Provider, do this.
bindAction().toProvider(BazActionProvider.class);
// You can also scope stuff:
bindAction().to(MySingletonAction.class).in(Singleton.class);
}
}
Этот шаблон использования Module
, чтобы скрыть многострочный бит, используется в коде Guice. Это немного работает впереди, но держит вещи в чистоте. Вы также можете сделать что-то подобное для MapBinder
, если вам нужно. Имейте в виду, что вы можете создать столько ActionModule
, сколько хотите.