#string #list #listview #javafx #spring-data-jpa
Вопрос:
Я использую метод Spring data jpa findAll()
. Таким образом, он возвращает список объектов. вот сущность.
@Entity @Table(name = "country") @Data public class CountryEntity { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "country_id") private Long id; @Column(name = "country_name") private String name; @OneToMany(mappedBy ="countryEntity") private Collectionlt;GovernmentEntitygt; governments; }
и findAll()
метод jpa данных является
Listlt;CountryEntitygt; entities = countryRepo.findAll();
Я хочу получить список названий стран в виде строки БЕЗ ИСПОЛЬЗОВАНИЯ циклов или потоков (проблемы с производительностью).
Я использовал потоки, и это отлично работает с JavaFX ListView
@FxmlView("/address.fxml") @Component @RequiredArgsConstructor public class HomeController implements Initializable { private ObservableListlt;Stringgt; countriesNames; @FXML private ListViewlt;Stringgt; countryListView; @Override public void initialize(URL url, ResourceBundle resourceBundle) { Listlt;CountryEntitygt; entities = countryRepo.findAll(); List lt;Stringgt; countryList = entities.stream().map(o-gt; Objects.toString(o.getName())).collect(Collectors.toList()); countriesNames = FXCollections.observableList(countryList); countryListView.getItems().addAll(countriesNames); } }
Комментарии:
1. проработайте учебник о том, как использовать ListView, в частности о том, как настроить визуальное представление его элементов
2. конечно, я буду благодарна клеопатре
Ответ №1:
Сделайте свой ListView
a ListViewlt;CountryEntitygt;
и используйте фабрику ячеек для настройки дисплея:
public class HomeController implements Initializable { private ObservableListlt;Stringgt; countriesNames; @FXML private ListViewlt;CountryEntitygt; countryListView; @Override public void initialize(URL url, ResourceBundle resourceBundle) { Listlt;CountryEntitygt; entities = countryRepo.findAll(); countryListView.getItems().addAll(entities); countryListView.setCellFactory(lv -gt; new ListCelllt;CountryEntitygt;() { @Override protected void updateItem(CountryEntity country, boolean empty) { super.updateItem(country, empty); if (empty || country == null) { setText(""); } else { setText(country.getName()); // or however you want to display it } }); } }
Если вам действительно нужен только список названий стран, и вы не хотите получать список стран CountryEntity
и извлекать из них имена, вам необходимо определить метод в своем репозитории для этой цели:
public interface CountryEntityRepository extends JpaRepositorylt;CountryEntity, Longgt; { // existing methods... @Query("select c.name from CountryEntity c") Listlt;Stringgt; findCountryNames() ; }
А потом, конечно, просто сделай
@FXML private ListViewlt;Stringgt; countryListView ; @Override public void initialize(URL url, ResourceBundle resourceBundle) { countryListView.getItems().addAll(countryRepo.findCountryNames()); }
Однако первый подход почти наверняка предпочтительнее. Вероятно, в какой-то момент вам понадобятся другие данные CountryEntity
.
Комментарии:
1. большое спасибо, ты герой