EDIT: этот ответ основан на идее, что вам нужно будет делать подобные вещи для разных объектов и разных свойств в другом месте вашего кода. Если вы только должны преобразовать список ViewValues в список Longs by ID, тогда придерживайтесь своего исходного кода. Однако, если вы хотите использовать более многоразовое решение, прочитайте ...
Я бы объявил интерфейс для проекции, например
public interface Function<Arg,Result>
{
public Result apply(Arg arg);
}
. Тогда вы можете написать одно общее преобразование method:
public <Source, Result> List<Result> convertAll(List<Source> source,
Function<Source, Result> projection)
{
ArrayList<Result> results = new ArrayList<Result>();
for (Source element : source)
{
results.add(projection.apply(element));
}
return results;
}
Тогда вы можете определить простые проекции, подобные этому:
private static final Function<ViewValue, Long> ID_PROJECTION =
new Function<ViewValue, Long>()
{
public Long apply(ViewValue x)
{
return x.getId();
}
};
И примените его так:
List<Long> ids = convertAll(values, ID_PROJECTION);
(Очевидно с помощью кнопок K & amp; R и более длинных строк упрощает объявление прокрутки:)
Честно говоря, все это было бы намного лучше с лямбда-выражениями, но неважно ...
Если вы хотите, чтобы геометрия содержалась в состоянии, вы можете попробовать
select t2.*
from my_table t1
inner join my_table t2 on st_dwithin(t1.geom,t2.geom, 0)
and t1.type='State'
and t2.type!='State'
или для st_contains
select t2.*
from my_table t1
inner join my_table t2 on st_contains(t2.geom,t1.geom)
and t1.type='State'
and t2.type!='State'