NamedQuery
to select entities with embedded composite ids.
The code is shown below. The entity class is the same as before except for the @NamedQueries
annotation which defines two named queries. The first query searches for a user with a specific first name and last name. The second query allows you to specify multiple last names in an "in-clause".
import java.io.Serializable; import javax.persistence.Column; import javax.persistence.Embeddable; import javax.persistence.EmbeddedId; import javax.persistence.Entity; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; import javax.persistence.Table; import javax.persistence.Temporal; import javax.persistence.TemporalType; /** * The User entity which contains an embedded UserId. */ @Entity @Table(name = "Users") @NamedQueries({ @NamedQuery(name="user.findByName", query = "from User where id.firstName = :firstName and id.lastName = :lastName"), @NamedQuery(name="user.withLastNames", query = "from User where id.lastName in (:lastName)") }) public class User { @EmbeddedId private UserId id; private String website; @Temporal(TemporalType.TIMESTAMP) @Column(insertable = false) private Date lastUpdateTime; /** * Default constructor required by Hibernate. */ public User() { } /** * This represents a "composite primary key" for the Users table. * It contains all the columns that form a unique id. * Must implement equals() and hashcode() and be serializable. * https://community.jboss.org/wiki/EqualsAndHashCode */ @Embeddable public static class UserId implements Serializable { private static final long serialVersionUID = 1L; private String firstName; private String lastName; /** * Default constructor required by hibernate. */ public UserId() { } /** (non-Javadoc) * @see java.lang.Object#hashCode() */ @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((firstName == null) ? 0 : firstName.hashCode()); result = prime * result + ((lastName == null) ? 0 : lastName.hashCode()); return result; } /** (non-Javadoc) * @see java.lang.Object#equals(java.lang.Object) */ @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; UserId other = (UserId) obj; if (firstName == null) { if (other.firstName != null) return false; } else if (!firstName.equals(other.firstName)) return false; if (lastName == null) { if (other.lastName != null) return false; } else if (!lastName.equals(other.lastName)) return false; return true; } } }Usage:
The code snippet below shows how you would use the named queries:
// the first query Query query1 = entityManager.createNamedQuery("user.findByName") .setParameter("firstName", "Peter") .setParameter("lastName", "Griffin"); List<User> resultList = query1.getResultList(); // the second query Query query2 = entityManager.createNamedQuery("user.withLastNames") .setParameter("lastNames", Arrays.asList("Dent", "Griffin")); List<User> resultList = query2.getResultList();
No comments:
Post a Comment
Note: Only a member of this blog may post a comment.