Сначала подключим саму библиотеку в Maven:
1 2 3 4 5 6 7 |
... <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-jpamodelgen</artifactId> <version>4.3.6.Final</version> </dependency> ... |
Теперь при сборке Maven-ом будут автоматически генерироваться классы JPA 2 MetaModel. Нам нужно, чтобы эти классы генерировались и использовались и при работе в Eclipse. Для этого заходим в свойства проекта и находим пункт “Java Compiler/Annotation Processing”. Ставим галочку “Enable project specifing settings” и прописываем в “Generate source directory” путь “target/metamodel”.
Затем заходим в настройках проекта в “Java Compiler/Annotation Processing/Factory Path” и добавляем туда библиотеку “hibernate-jpamodelgen-1.3.0.Final.jar”. Я обычно копирую копию этой библиотеки в подпапку “metamodel-generator-lib” папки проекта.
Теперь можно использовать автоматически сгенерированные классы метамодели.
Например, для класса Customer:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
/// //... imports @Entity @Table(name = "customer") public class Customer implements Serializable { /** * */ private static final long serialVersionUID = -8596445772945564946L; @Id @GeneratedValue(strategy = GenerationType.AUTO) private Integer id; @Column @Size(min = 1, max = 200) @NotNull private String code; @Column @Size(min = 1, max = 200) @NotNull private String name; @Column @Size(min = 1, max = 50) @NotNull private String phone; @Column(name = "current_credit") @NotNull private BigDecimal currentCredit; @Version private Integer version; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public BigDecimal getCurrentCredit() { return currentCredit; } public void setCurrentCredit(BigDecimal currentCredit) { this.currentCredit = currentCredit; } public Integer getVersion() { return version; } @Override public int hashCode() { if (this.id == null) return super.hashCode(); else return this.id.hashCode(); } @Override public boolean equals(Object other) { if (other instanceof Customer) { Customer customerOther = (Customer) other; if (customerOther.getId() != null && id != null && id.equals(customerOther.getId())) return true; } return false; } @Override public String toString() { return "Customer [id=" + id + ", code=" + code + ", name=" + name + ", phone=" + phone + ", currentCredit=" + currentCredit + ", version=" + version + "]"; } } |
Будет сгенерирован класс Customer_:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
/// ... imports @Generated(value = "org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor") @StaticMetamodel(Customer.class) public abstract class Customer_ { public static volatile SingularAttribute<Customer, String> code; public static volatile SingularAttribute<Customer, BigDecimal> currentCredit; public static volatile SingularAttribute<Customer, String> phone; public static volatile SingularAttribute<Customer, String> name; public static volatile SingularAttribute<Customer, Integer> id; public static volatile SingularAttribute<Customer, Integer> version; } |
И его можно будет использовать в CriteriaQuery:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
... @Transactional(readOnly = true) @Override public Customer findByCode(String code) { CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder(); CriteriaQuery<Customer> criteriaQuery = criteriaBuilder .createQuery(Customer.class); Root<Customer> customer = criteriaQuery.from(Customer.class); criteriaQuery.where(criteriaBuilder.equal(customer.get(Customer_.code), code)); TypedQuery<Customer> typedQuery = em.createQuery(criteriaQuery); List<Customer> result = typedQuery.getResultList(); if (result.size() > 0) { return result.get(0); } return null; } ... |