Pętla for do pobrania danych użytkowników z bazy

0

Wymysliłem poniższe pobieranie uzytkownikow z bazy danych. Problem polega na tym,że identyfikator powinien przyjmowac wartosc 1L, 2L, 3L itd. Jak ustawić w for "i" żeby przyjmowało wartość "iL" ?

 
public void pobierzUzytkownikow()
{
	entityManagerFactory = Persistence.createEntityManagerFactory("test");
	entityManager = entityManagerFactory.createEntityManager();
	entityManager.getTransaction().begin();
	for(long i = 0;i<10;i++){
	Uzytkownik uzytkownik = entityManager.find(Uzytkownik.class, i);
	System.out.println("imie:"+uzytkownik.getImie());}
	entityManager.getTransaction().commit();
	entityManager.close();
	entityManagerFactory.close();
}

0

czemu nie

Uzytkownik uzytkownik = entityManager.find(Uzytkownik.class, i + "L");

?

  • zacznij numerowac od 1 a nie od 0 jesli chcesz miec 1L, 2L, 3L...

dodanie znacznika <code class="java"> - @furious programming

1

@davyd prawdopodobnie mało jeszcze wiem, ale przyznaję, że pierwszy raz widzę taki sposób pobierania danych (entity.find() w pętli).
Czy to ma jakieś konkretne uzasadnienie? Czemu nie jedno zapytanie, które zwróci to czego potrzebujesz od razu?

0

@shagrin myslę, że to ja mało wiem :). Czyli pobieranie wszystkich uzytkownikow z bazy forem po id=iL nie powinno tak wyglądąć..hmm tak myslałem. Jaki jest inny sposób żeby to pobrać ? Rozumiem że mozna pobrać wszystkich jednym zapytaniem - podrzuć Twój sposób.

1

@davyd a jak obiektów będzie milion to poczekasz na wyniki tydzień :D Popatrz na metody entity managera z "createQuery" w nazwie na przykład. Takie to query pozwala pobrać całą listę wyników na raz ;]

0

ok dzięki zerknę na createQuery czuje, że tkwią tu duże możliwości...

1

@davyd moja metoda wykorzystuje createQuery, o którym wspomniał @Shalom (no nazwijmy to specjalną wersją createQuery- createNamedQuery)

Konkretnie, tworzę sobie @NamedQuery w Entity User:

@Entity
@NamedQuery(name="User.findAll", query="SELECT u FROM User u") 

A potem pobieram np w taki sposób:

 List<User> users = em.createNamedQuery("User.findAll", User.class).getResultList();

Osobiście staram się używać raczej @NamedQuery i @NamedNativeQuery zdefiniowanych w Entity, niż pisać zapytania gdzieś podczas pobierania danych (ale to moja preferencja, bo łatwiej mi się w takiej formie odnaleźć).

0

@shagrin jeśli wiesz z góry co to będą za zapytania to jasne ;) Ale zauważ że możesz je chcieć jakoś dodatkowo parametryzować jakimiś danymi i wtedy już nie da rady :) Załóżmy na przykład że chcesz przekazać listę ID które chcesz pobrać z bazy (poprzez where id in (...)).

0

@Shalom jak najbardziej, zgadzam się, że czasem po prostu trzeba użyć natywnego zapytania, dlatego też napisałam, że "staram się używać".

Jednak jeśli chodzi o przekazanie listy idków jako parametru, robię to w taki sposób:

@Entity
@NamedQueries {
	@NamedQuery(name="User.findAll", query="SELECT u FROM User u"),
	@NamedQuery(name="User.findByIdList", query="SELECT u FROM User u WHERE u.id IN (:idList)") 
}

A wywołuję w taki sposób:

public List<Users> getUsersByIds(List<int> idList){
	List<User> users = em.createNamedQuery("User.findByIdList", User.class)
						.setParameter("idList", idList);
						.getResultList();
}

Piszę to teraz bardziej jako pseudokod, bez sprawdzania, więc miejcie na uwadze, że mógł się wkraść jakiś błąd. Kod opisuje jednak ideę samego rozwiązania.

1 użytkowników online, w tym zalogowanych: 0, gości: 1