Entity Bean Sql Syntax

Sintassi sql

Gli entity bean usano una sintassi sql un po' diversa rispetto a quella standard eccone alcuni esempi:
Per una sintassi più completa si veda il documento ufficiale

SELECT u FROM User u WHERE u.userName = :userName

che si completa con questo pezzo di codice
query.setParameter("userName", userName);

L'uso della query precedente era molto intuitivo, quella sottostante invece fa un join della tabella
SELECT g.contacts FROM ContactGroup g WHERE g.contactGroupId = :groupId

prende le entità facendo una join tra ContactGroup e altre due tabelle. Come fare la join è espresso nelle annotazioni.

Sintassi completa

Questa è una sintassi per risultato singolo

queryString = "SELECT u FROM User u WHERE u.userName = :userName AND u.password = :password";
query = entityManager.createQuery(queryString);
query.setParameter("userName", userName);
query.setParameter("password", password);
User user = (User) query.getSingleResult();

Questa invece è per liste di risultati
final String queryString = "SELECT g.contacts FROM ContactGroup g WHERE g.contactGroupId = :groupId";
Query query;
query = entityManager.createQuery(queryString);
query.setParameter("groupId", groupId);
List<Contact> contacts = query.getResultList();

Sintassi dentro i java

Accesso a un dato

Per l'accesso a una colonna tramite un metodo accessorio

@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "ContactGroupId", unique = true, nullable = false)
public Long getContactGroupId()
{
    return this.contactGroupId;
}
public void setContactGroupId(Long contactGroupId)
{
    this.contactGroupId = contactGroupId;
}
 
@Column(name = "Name", nullable = false, length = 20)
public String getName()
{
    return this.name;
}
public void setName(String name)
{
    this.name = name;
}

Join uno a molti

Invece una semplice join uno a molti della tabella dei gruppi che corrisponde alla classe a quella degli utenti collegati tramite userid

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "UserId", nullable = false)
public User getUser()
{
    return this.user;
}

Join molti a molti

Per una join molti a molti invece bisogna avere un campo che contenga l'insieme dei dati

private Set<ContactGroup> parentContactGroups = new HashSet<ContactGroup>(0);
 
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "childrenContactGroups")
public Set<ContactGroup> getParentContactGroups()
{
    return this.parentContactGroups;
}
public void setParentContactGroups(Set<ContactGroup> parentContactGroups)
{
    this.parentContactGroups = parentContactGroups;
}

La mappedBy serve per essere usata nelle query ecco in che modo
 "SELECT g.childrenContactGroups FROM ContactGroup g WHERE g.contactGroupId = :groupId";
Salvo diversa indicazione, il contenuto di questa pagina è sotto licenza Creative Commons Attribution-ShareAlike 3.0 License