Zwei Fragen zu EntityBeans (EJB 3.0)

rogerssocke

Mitglied
Hallo Leute,

ich beschäftige mich gerade mit Entity Beans und habe ein paar Fragen dazu, die Ihr mir hoffentlich beantworten könnt.

  1. Wie kann ich mit NativeQuerys als Result eine Map bekommen?
    ich möchte also genau soetwas haben, nur halt mit NativeQuerys
    Java:
    List<Map<String, Object>> list = (List<Map<String, Object>>) entityManager.createQuery("select new map(name as name) from Customer").getResultList();
    falls es nicht mit NativeQuerys funktioniert, wie würde der Datenbank aufruf aus der Sessionbean dann aussehen.
    Mein Ziel ist es also ein ganz normalen SQL-String zur Datenbank zu schicken und das Ergebnis in eine Map zu speichern.

  2. Was passiert in eine JEE Anwendung mit Entity-Beans 3.0 falls ich außerhalb des Applicationserver einfach per SQL einen Datensatz auf der DB ändere?
    Cached der Server irgendwas?

Danke schon mal für die Hilfe.

Gruß

rogerssocke
 
G

Gelöschtes Mitglied 5909

Gast
1. ich wüsste nicht dass das geht und würde mir dafür einen service schreiben
2. das kommt darauf an wie du jpa konfiguriert hast. Normalerweise wird gecached und du bekommst die Änderungen warscheinlich nicht mit
 

rogerssocke

Mitglied
Danke schonmal für deine Antwort, ich habe allerdings zu deinen Antworten noch ein paar Fragen.

1. ich wüsste nicht dass das geht und würde mir dafür einen service schreiben
Was genau meinst du mit einem Service dafür schreiben? Hast du dafür ein Beispiel?




2. das kommt darauf an wie du jpa konfiguriert hast. Normalerweise wird gecached und du bekommst die Änderungen warscheinlich nicht mit
Falls der Server gecached ist und ich etwas per SQL ändere, habe ich dann irgend eine Möglichkeit den Cache des Servers zu löschen? Bewirkt der entitymanager.flush() dies oder ist dieser Befehl nur für eine Transaktion?
 
G

Gelöschtes Mitglied 5909

Gast
1. Im Prinzip meine ich damit, dass du dir eine Methode schreibst, dir das query absetzt und dir die map zusammenbastelst.
Als Service meine ich eine High Level Datenbankschnittstelle, im Gegensatz zur Low Level Datenbankschnittstelle (DAO).
Wenn du damit nix anfangen kannst, dann schreib dir einfach ne Methode :)

2. entityManager.clear() sollte helfen, flush() erzwingt, dass die aktionen "jetzt" ausgeführt werden
 

rogerssocke

Mitglied
Zu 1.

Ich wäre für ein Beispiel sehr Dankbar. Meine bisherige SessionBean sieht so aus.

Java:
@Stateless(mappedName = "AgioEJB")
public class AgioEJB implements AgioEJBRemote {
	
	@PersistenceContext
	EntityManager em;
	
	Logger logger = Logger.getLogger(AgioEJB.class);
	

    /**
     * Default constructor. 
     */
    public AgioEJB() {  
    }


	@Override
	public Agio saveAgio(Agio agio) {
		logger.trace("Agioobject wird gemerged");
		return em.merge(agio);
	}


	@Override
	public Agio selectAgio(int id) {
		Agio agio = em.find(Agio.class, id);
		logger.trace("Agio mit der ID:" + id + "aus der Datenbank geladen.");
		logger.trace("Gefundenes Agioobject: " + agio);
		return agio;
	}


	@Override
	public void removeAgio(int id) {
		Agio agio = em.find(Agio.class, id);
		logger.trace("Aufschlagsdatensatz: " + agio + " wird geschlöscht");
		em.remove(agio);	
		em.flush();
	}


	@Override
	public Agio selectCopyOfAgio(int id) {
		Agio agio = selectAgio(id);
		agio.setId(null);
		agio.setVersion(null);
		return agio;
	}
	
	public List<Map<String, Object>> selectAgioMap() {	
		List<Map<String, Object>> list = (List<Map<String, Object>>) em.createQuery("select new map(name as name) from Agio").getResultList();
			return list;
				
				
	}

}

Danke für die Hilfe.
 
G

Gelöschtes Mitglied 5909

Gast
Ich hab keine Ahnung wie dein Agio aussieht, aber egal

so halt ungefähr:

Java:
  public Map<String, Agio> selectAgioMap() {  
      List<Agio> agios = em.createQuery("select a from Agio a").getResultList();
      Map<String, Agio> map = new HashMap<String, Agio>();
      for (Agio agio : agios) {
      	map.put(agio.getName(), agio);
      }
      return map;
  }
 

rogerssocke

Mitglied
Danke für deine Mühe, aber dies bringt mich leider nicht weiter.
Da könnte ich ja wieder kein normalen SQL String benutzen und hätte genau das selbe Ergebnis wie mit dem new map():
Java:
List<Map<String, Object>> list = (List<Map<String, Object>>) em.createQuery("select new map(name as name, percent as percent) from Agio").getResultList();

Wofür ich ein Beispiel bräuchte wäre eine Methode, der ich einen beliebigen SQL-String gebe und eine HashMap<String, Object> als Ergebnis zurück erhalte.

Also z.B. Key = name Value = Hans Müller; Key = percent Value = 23,4


EDIT:
Habe gerade gesehen, wo du mich anscheinent falsch verstanden hast. Mit HashMap<String,Object> will ich kein name als Schlüssel und als Objekt das Agio Objekt sondern ich wollte das die HaspMap als Schlüssel die ganzen Datenbankspalten besitzt und als Wert den entsprechenden Wert der Datenbankspalte als z.B. ein String, Double usw.
Und da das mit dem Agio nur ein einfaches Beispiel ist wollte ich ganz gerne einen beliebigen SQL-String abgegeben und alle zurückgegeben Spalten als Key und mit entsprechenden Wert abspeichern.

Bei einer normalen JDBC-Verbindung würde das wie folgt aussehen und sowas suche ich für meine Session Bean:
Java:
resultSet = statement.executeQuery( sql);
ResultSetMetaData metaData = resultSet.getMetaData();
int columnCount = metaData.getColumnCount();
while( resultSet.next()) 
{
                HashMap<String,String> cols = new HashMap<String,String>( columnCount);
                for( int i = 1; i <= columnCount; i++) 
                {
                    String col = metaData.getColumnName( i).toUpperCase();
                    String val = resultSet.getString( i);
                    cols.put( col, val);
                }
                rows.add( cols);
}
 
Zuletzt bearbeitet:
G

Gelöschtes Mitglied 5909

Gast
wie soll das denn in der Datenbank aussehen? Das funktioniert doch überhaupt nicht, es sei denn du speicherst das percent in einem varchar. Ich weiß weder wie deine Tabelle aussieht, noch was du davon auslesen willst, noch was du damit machen willst
 

rogerssocke

Mitglied
Habe meinen letzten Beitrag editiert, leider hattest du das schon geantwortet.
Als Beispiel habe ich eine Tabelle mit dem Namen: customer und den spalten:
name vom Typ varchar
postcode vom Typ integer

der Befehl
Code:
(List<Map<String, Object>>) em.createQuery("select new map(name as name, postcode as postcode) from Customer").getResultList()

gibt mir jetzt eine Liste mit einer Map zurück die wie folgt aufgebaut ist:
Key = name Value =String z.B. Hans Müller
Key = postcode Value = Integer z.B. 44789

das Funktioniert auch schon nur das ich kein richtiges SQL verwenden kann bei createQuery.
Der new map Befehl gibt mir die Map zurück.

Ich möchte jetzt eine Methode der ich einen SQL String gebe und die mir das gleich zurück gibt wie der new map Befehl allerdings mit normalen SQL.
 

Ähnliche Java Themen


Oben