JPA Queries Listen und Maps

zerix

Hausmeister
Moderator
Hallo,

ich habe zwei BusinessObjects die vereinfacht so aussehen

Java:
public class Model1{

   private int id;
   private String name;
   private List<Model2> params;
   private String nochwas;


   //Getter und Setter

}

Java:
public class Model2{

   private int id;
   private String name;
   private Map<String, String> params;

   //Getter und Setter

}

Jetzt habe ich ein Object von Model1 bei dem der Name und die Liste gesetzt sind. Jetzt möchte ich das dem entsprechende Object aus der DB laden, bei dem der Rest auch gesetzt ist.

Allerdings weiß ich nicht so ganz wie ich die Parameter mit der Liste und der Map bei den Queries setzen soll. Finde auch kein passendes Beispiel im Internet. Es wird zwar gesagt, dass JPA 2.0 Listen unterstützt, aber es kommt dennoch eine Fehlermeldung bei der Liste.

Gruß

Sascha
 
HeyTom,

wie ich generell JPA einsetze ist mir bewusst. ;-)

Was ich nicht weiß ist, wie ich mir ein Object anhand einer Liste oder einer Map aus der Datenbank geben lasse.

Beispiel
Java:
public class Person{

   private String name;
   private Map<String, String> phones;
   private String  city;

}


Jetzt hab ich mehrere Personen in der DB.
Ich bekomme von irgendwo einen Namen und eine Map mit Telefonnummern gegeben, aber nicht die Stadt in der er lebt.
Jetzt möchte ich überprüfen, ob in meiner DB eine Person mit diesem Namen und den Telefonnummern steht.
Das muss ja funktionieren, ohne mit alle Personen mit diesem Namen aus der DB geben zu lassen und dann zu kontrollieren, welche jetzt diese Telefonnummern hat.
Also ich möchte einer Query den Namen und die Map mit Telefonnummern geben und dann von der DB, alle Personen bekommen die darauf passen.


In meinem Problem brauche ich das mit einer Liste und mit einer Map, da meine BusinessObjecte vereinfach aussehen wie oben.

Ich hoffe ich konnte mein Problem verständlich erklären.

Gruß

Sascha
 
Hallo,

Ich hoffe ich konnte mein Problem verständlich erklären.
Leider nicht so ganz...

willst du deine Entitäten nach einem bestimmten Key oder oder einem Value in der Map filtern?

Na ja, ausgehend vom oben verlinkten Beispiel;

Java:
package de.tutorials.user;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.MapKey;
import javax.persistence.OneToMany;

import lombok.Data;

@Data
@Entity
public class User {
	@Id
	@GeneratedValue
	protected Long id;
	protected String name;

	@OneToMany
	protected Set<Role> roles = new HashSet<Role>();
	
	@OneToMany
	@MapKey(name="id")
	protected Map<String, Attribute> attributes = new HashMap<String, Attribute>();
}

Java:
package de.tutorials.user;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

import lombok.Data;

@Entity
@Data
public class Attribute {
	@Id
	@GeneratedValue
	protected Long id;
	protected String name;
	protected String value;
	
	public Attribute(String name, String value) {
		super();
		this.name = name;
		this.value = value;
	}
}

Im UserDao:
Java:
	@Override
	public List<User> findUserByAttribute(Attribute attribute) {
		List<User> result = em.createQuery(
				"select u from User u JOIN u.attributes a where a.name=? and a.value=?").setParameter(1,
				attribute.getName()).setParameter(2, attribute.getValue())
				.getResultList();
		return result;
	}

Generiert folgende SQL Abfrage:
SQL:
Hibernate: select user0_.id as id1_, user0_.name as name1_ from User user0_ inner join User_Attribute attributes1_ on user0_.id=attributes1_.User_id inner join Attribute attribute2_ on attributes1_.attributes_id=attribute2_.id where attribute2_.name=? and attribute2_.value=?
Gruß Tom
 
Mal noch ein Beispiel. ;-)

Java:
public class Test{

public static void main(String arg[]){

    Person person = new Person();

   person.setName("Name");

    Map<String, String> phones = new HashMap<String,String>();

   phones.put("handy", "0178-1234567");
   phones.put("home", "01234-123456");

   person.setPhones(phones);

   Person person = dao.findByExample(person);


}

}

Jetzt möchte ich, dass mir die Person aus der DB zurück gegeben wird, die diesen Parametern entspricht, die ich dieser Person gesetzt habe.

In dem Beispiel möchte ich die city wissen, hab den Namen und die Telefonnummern dieser Person. Das heißt ich muss die Person anhand des Namens und der Telefonnummern (bei denen ich nicht weiß wieviele es sind) aus der Datenbank bekommen.

Ich hoffe, jetzt ist es etwas deutlicher.

Gruß

Sascha


EDIT: Ich weiß jetzt halt nicht wie ich das DAO umsetzen soll, also die Query-Abfrage.
 

Neue Beiträge

Zurück