abgeleitet • ID von Entity B (Parent) ist Primärschlüssel von Entity A <<Partent>> Kunde long kundeId <PK> String name <<Dependent>> Kreditkarte Long nummer <PK> Kunde kunde <PK> many-to-one one-to-one
Kreditkarte Long nummer <PK> Kunde kunde <PK> many-to-one one-to-one @Entity public class Kunde { @Id private long kundeId; private String name; ... } @Entity @IdClass(KundeId.class) public class Kreditkarte { @Id private Long nummer; @Id @ManyToOne private Kunde kunde; ... }
int id; ... @ElementCollection @CollectionTable(name="WEBTWO_TAGS") @Column(name="TAG") private Set<String> tags; } ARTIKEL ARTIKEL ARTIKEL ID TITLE ... WEBTWO_TAGS WEBTWO_TAGS ARTIKEL_ID TAG
int id; ... @ElementCollection @CollectionTable(name="WEBTWO_TAGS") private Set<Tag> tags; } ARTIKEL ARTIKEL ARTIKEL ID TITLE ... WEBTWO_TAGS WEBTWO_TAGS WEBTWO_TAGS ARTIKEL_ID TAG ADDED @Embeddable public class Tag { private String tag; @Temporal(TIMESTAMP) private Date added; }
Embeddable Defaults oder @AttributeOverride(s) @ElementCollection @MapKeyJoinColumn(s) @OneToMany @OneToOne @MapKey, wenn der Key selbst PK ist oder wenn Key Feld der Entität im Value ist @MapKeyClass, wenn keine Generics verwendet werden @MapKey, wenn der Key selbst PK ist oder wenn Key Feld der Entität im Value ist @MapKeyClass, wenn keine Generics verwendet werden
'Interview' WHEN RecordReview THEN 'CD Kritik' WHEN ShowReview THEN 'Konzert Kritik' ELSE 'Sonstiges' END FROM Artikel a WHERE a.author.name = 'Michael'
'Interview' WHEN RecordReview THEN 'CD Kritik' WHEN ShowReview THEN 'Konzert Kritik' ELSE 'Sonstiges' END FROM Artikel a WHERE a.author.name = 'Michael' SELECT a FROM Artikel a WHERE TYPE(a) IN (RecordReview, ShowReview)
'Interview' WHEN RecordReview THEN 'CD Kritik' WHEN ShowReview THEN 'Konzert Kritik' ELSE 'Sonstiges' END FROM Artikel a WHERE a.author.name = 'Michael' SELECT a FROM Artikel a WHERE TYPE(a) IN (RecordReview, ShowReview) class Artikel { Map<ImageMeta, Image> image; ...} SELECT a.titel FROM Artikel a JOIN a.image i WHERE KEY(i).pfad = :pfad
Objekte über die Abfrage erreicht werden EntityManager em; QueryBuilder qb = em.getQueryBuilder(); QueryDefinition def = qb.createQueryDefinition(); //select a from Artikel DomainObject artikel = def.addRoot(Artikel.class);
= q.addRoot(Artikel.class); q.where(artikel.get("titel").equal("EJUG-Days") .and(artikel.get("autor").equal("Michael")) ); SELECT a FROM Artikel a WHERE a.titel = "EJUG-Days" AND a.author = "Michael"
• join() • leftJoin() DomainObject artikel= q.addRoot(Artikel.class); DomainObject b = artikel.join("comments").join("benutzer"); b.where(b.get("name").equal("mike")); SELECT a FROM Artikel a JOIN a.comments c JOIN c.benutzer b WHERE b.name = „mike“
DomainObject formuliert: • joinFetch() • leftJoinFetch() DomainObject artikel= q.addRoot(Artikel.class); DomainObject b = artikel.leftJoinFetch("comments"); SELECT a FROM Artikel a LEFT JOIN FETCH a.comments c
= qb.createQueryDefinition(Artikel.class); DomainObject bild = item.join("bilder"); artikel.select(artikel.get("titel"), bild) .where(bild.key().like("U2")); SELECT a.titel, bild FROM Artikel a JOIN a.bilder b WHERE KEY(b) LIKE "U2"
guteCD = qb.createQueryDefinition(Record.class); DomainObject cd = qb.createQueryDefinition(Record.class); guteCD.where(guteCD.get("rating") .greaterThan(cd.select(cd.get("rating").avg()))); SELECT guteCD FROM Record guteCD WHERE guteCD.rating > (SELECT AVG(c.rating) FROM Record c)
die Methoden QueryDefinition#groupBy und #having angegeben QueryDefinition q = qb.createQueryDefinition(); DomainObject cd = q.addRoot(Record.class); q.select(cd.get("status"), cd.get("rating").avg(), cd.count()) .groupBy(cd.get("status")) .having(q.get("status").in(1, 2)); SELECT cd.status, AVG(cd.rating), COUNT(cd) FROM Record cd GROUP BY cd.status HAVING cd.status IN (1, 2)
q = qb.createQueryDefinition(); DomainObject artikel = q.addRoot(Artikel.class); q.orderBy(artikel.get("datum").desc()); SELECT a FROM Artikel a ORDER BY a.datum DESC
JPA 2.0 bietet nur ein Basis Interface javax.persistence.Cache public boolean contains(Class cls, Object primaryKey); public void evict(Class cls, Object primaryKey); public void evict(Class cls); public void evictAll();