Câu hỏi Làm cách nào để truy vấn chỉ các thực thể siêu lớp trong truy vấn jpql?


Tôi có các thực thể sau:

@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="orderType", discriminatorType=DiscriminatorType.STRING)
@DiscriminatorValue(value="BASE")
@Table(name = "orders")
public class OrderEntity implements Serializable {
...

@Entity
@DiscriminatorValue(value="RECURRING")
public class RecurringOrderEntity extends OrderEntity{
...

Tôi có thể tìm tất cả các lớp con (RecurringOrderEntity) với jpql sau:

Query q = em.createQuery(
                "SELECT o from RecurringOrderEntity o where "
                + "o.cancellationDate is null "
                + "and o.maxOccurrences = o.occurrence");

Cú pháp JPQL cho việc tìm kiếm là gì chỉ có các thực thể không phải Trường hợp của RecurringOrderEntity?

Tôi đang sử dụng Eclipselink 2.0.0 làm nhà cung cấp JPA.

cảm ơn!


8
2017-09-22 02:39


gốc




Các câu trả lời:


Cú pháp JPQL cho việc tìm kiếm các thực thể không phải là các cá thể của RecurringOrderEntity là gì?

Sử dụng biểu thức loại thực thể với TYPE nhà điều hành. Một cái gì đó như thế này (không chắc chắn về các truy vấn chính xác mà bạn muốn nhưng bạn có được ý tưởng):

SELECT o 
FROM OrderEntity o 
WHERE TYPE(o) <> RecurringOrderEntity
  AND o.cancellationDate is null
  AND o.maxOccurrences = o.occurrence

Bên dưới, phần có liên quan của đặc tả JPA 2.0:

4.6.17.4 Biểu thức loại đối tượng

Biểu thức loại thực thể có thể được sử dụng   để hạn chế đa hình truy vấn. Các   Toán tử TYPE trả về loại chính xác   của đối số.

Cú pháp của một loại thực thể   biểu thức như sau:

entity_type_expression ::=
       type_discriminator |
       entity_type_literal |
       input_parameter
type_discriminator ::=
       TYPE(identification_variable |
            single_valued_object_path_expression |
            input_parameter )

An entity_type_literal Là   được chỉ định bởi tên thực thể.

Lớp Java của thực thể được sử dụng   như một tham số đầu vào để xác định   loại thực thể.

Ví dụ:

SELECT e
FROM Employee e
WHERE TYPE(e) IN (Exempt, Contractor)

SELECT e
FROM Employee e
WHERE TYPE(e) IN (:empType1, :empType2)

SELECT e
FROM Employee e
WHERE TYPE(e) IN :empTypes

SELECT TYPE(e)
FROM Employee e
WHERE TYPE(e) <> Exempt

20
2017-09-22 05:25



Có cách nào để làm điều này không biết về bất kỳ lớp con? - mihn