GenericVehicle表示可能具有0个或更多GenericVehicleAccessory的车辆。
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class GenericVehicle extends GenericEntity {
@Id
private Long id;
@Column(nullable=false)
@NotNull(message="{GenericVehicle.vehicleName.notNull")
@Size(max=128, message="{GenericVehicle.vehicleName.size")
private String vehicleName;
@OneToMany(mappedBy = "genericVehicle", cascade = { CascadeType.ALL }, orphanRemoval = true, fetch = FetchType.LAZY)
private Set<GenericVehicleAccessory> accessories;
// ..
}
@Entity
@Table(name = "GENERICVEHICLEACCESSORIES")
public class GenericVehicleAccessory extends GenericEntity {
@Id
private long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "GENERICVEHICLE_ID")
private GenericVehicle genericVehicle;
private String name;
// ..
}
我想执行一个查询,选择所有拥有给定标准集的Set(附件)的GenericVehicle。
例如:
+----+-------------------+
| ID | VEHICLENAME |
+----+-------------------+
| 1 | Toyota Auris |
| 2 | Volkswagen Passat |
| 3 | Bentley Arnage |
| 4 | Hyundai Accent |
| 5 | Toyota Auris |
+----+-------------------+
+-------------------+----------------------------------+
| GENERICVEHICLE_ID | NAME |
+-------------------+----------------------------------+
| 1 | Leather seats |
| 1 | Electronic stability control |
| 2 | Power steering |
| 4 | ABS |
| 4 | Airbag |
| 4 | Cruise control |
| 5 | Leather seats |
| 5 | Electronic stability control |
+-------------------+----------------------------------+
这样的标准:
criteria.setVehicleName="Toyota Auris";
new GenericVehicleAccessory tmp0 = new GenericVehicleAccessory();
tmp0.setName="Leather Seats";
new GenericVehicleAccessory tmp1 = new GenericVehicleAccessory();
tmp1.setName="Electronic stability control";
criteria.addToAccessory(tmp0);
criteria.addToAccessory(tmp1);
会选择ID = 1的GenericVehicle实体(因为ID = 5没有电子稳定控制)。
如何使用JPA Criteria API执行此操作?