2012-02-21 31 views
18

Tôi đã đọc bài viết "Dynamic, typesafe queries in JPA 2.0" và stumbled khi ví dụ này:Dấu gạch dưới được nối với tên lớp nghĩa là gì?

EntityManager em = ... 
CriteriaBuilder qb = em.getCriteriaBuilder(); 
CriteriaQuery<Person> c = qb.createQuery(Person.class); 
Root<Person> p = c.from(Person.class); 
Predicate condition = qb.gt(p.get(Person_.age), 20); 
//          ^^ --- this one 
c.where(condition); 
TypedQuery<Person> q = em.createQuery(c); 
List<Person> result = q.getResultList(); 

tôi đã tự hỏi, những gì chính xác không gạch dưới đây nghĩa là gì?

Vì dấu gạch dưới là một phần hợp lệ của một tên lớp, tôi không hiểu tại sao điều này có thể được sử dụng trong JPA. Tôi đã kiểm tra điều này với một thực thể hiện tại trong mã của mình và dĩ nhiên lớp học của tôi không thể được giải quyết là ClassName_

+0

Bạn cũng có thể hỏi câu hỏi của tác giả bài viết đó :) – Jayy

Trả lời

15

Đó là số metamodel cho sự kiên trì. Đó là cách bạn có thể thực hiện gõ các truy vấn JPA an toàn trong Java. Nó cho phép truy vấn kiểm tra tĩnh các truy vấn của bạn vì lớp Bar_ mô tả JPA Bar của bạn. Trong HQL, bạn có thể dễ dàng nhập nhầm một truy vấn và không biết nó cho đến khi nó được chạy. Vì vậy, về mặt kỹ thuật, các _ không có nghĩa là bất cứ điều gì, nhưng nó là quy ước được sử dụng bởi JPA để đặt tên một lớp metamodel của một lớp mô hình liên tục JPA. Model_ là metamodel của Model và nó cung cấp tên của các trường có thể truy vấn và loại của chúng.

+0

Tôi có phải bao gồm một phụ thuộc maven khác không? 'Bar_' được biết bởi trình biên dịch mà hiện tại không phải là trường hợp. – stacker

+1

Bạn có thể viết metamodel bằng tay, tạo nó và sau đó sao chép các tập tin bằng tay, hoặc kết hợp nó vào trong Maven build của bạn. Tôi đã tìm thấy [plugin Maven này] (http://janistoolbox.typepad.com/blog/2010/03/java-persistency-api-20-jpa-hibernate-jpa-metamodel-generator-maven-1.html) có thể thực hiện công việc. – ArtB

+0

@stacker đã giúp trình cắm thêm đó chưa? Nếu vậy tôi sẽ thêm nó vào câu trả lời. – ArtB

0

Tôi tìm thấy cách này để khai báo siêu mô hình trong số article này.

/** 
* A meta model class used to create type safe queries from person 
* information. 
* @author Petri Kainulainen 
*/ 
@StaticMetamodel(Person.class) 
public class Person_ { 
    public static volatile SingularAttribute<Person, String> lastName; 
} 
+0

Đây là những gì tôi đã đề cập đến bằng cách thực hiện nó bằng tay. :) Tôi khá chắc chắn rằng miễn là bạn có họ '@ StaticMetamodel' chú thích bạn có thể đặt tên lớp thực tế bất cứ điều gì bạn thích. – ArtB

Các vấn đề liên quan