如何通过 JPA 条件 api 查询中的对象值获取实体
How to fetch entities by objects value in JPA criteria api query
我正在使用 JPA 和 JSF 数据table 延迟加载。
这里一辆车可以由许多用户拥有。因此,当我登录到应用程序时,我希望登录用户拥有的汽车(假设它为 userId = 1)。
我有一个包含 carId 和 userId 列的映射 table "Cars_User"。
我的实体是这样的
我的车 Class
@Entity
@Table(name="car")
public class Car implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private String id;
@Transient
private boolean myCar;
@NotNull
@Size(min = 1, max = 50)
public String name;
@OneToMany(cascade = { CascadeType.REFRESH }, fetch = FetchType.LAZY, orphanRemoval = true)
@JoinTable(name = "Cars_User", joinColumns = @JoinColumn(name = "carId"), inverseJoinColumns = @JoinColumn(name = "userId"))
private List<User> carUsers = new ArrayList<User>();
getters ...
setters ...
}
用户Class
@Entity(name = "User")
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String firstName;
private String lastName;
}
我在这个 link 中找到了一个关于字符串集合列表的答案,但在我的案例中如何实现。
我想获取条件 api 中包含 carUsers 列表中已登录用户 ID "userId" 的所有 Cars 实体。有人可以帮忙吗?
我找到了解决方案。我已经在 isMember 函数中传递了登录用户对象 "user"。这可能对某人有帮助。
CriteriaBuilder criteriaBuilder = em.getEntityManagerFactory().getCriteriaBuilder();
CriteriaQuery<Car> criteria = criteriaBuilder.createQuery(Car.class);
Root<Car> root = criteria.from(Car.class);
criteria.where(criteriaBuilder.isMember(user, root.get(Car_.carUsers)));
List<Car> cars = em.createQuery(criteria).getResultList();
我正在使用 JPA 和 JSF 数据table 延迟加载。 这里一辆车可以由许多用户拥有。因此,当我登录到应用程序时,我希望登录用户拥有的汽车(假设它为 userId = 1)。 我有一个包含 carId 和 userId 列的映射 table "Cars_User"。 我的实体是这样的 我的车 Class
@Entity
@Table(name="car")
public class Car implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private String id;
@Transient
private boolean myCar;
@NotNull
@Size(min = 1, max = 50)
public String name;
@OneToMany(cascade = { CascadeType.REFRESH }, fetch = FetchType.LAZY, orphanRemoval = true)
@JoinTable(name = "Cars_User", joinColumns = @JoinColumn(name = "carId"), inverseJoinColumns = @JoinColumn(name = "userId"))
private List<User> carUsers = new ArrayList<User>();
getters ...
setters ...
}
用户Class
@Entity(name = "User")
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String firstName;
private String lastName;
}
我在这个 link 中找到了一个关于字符串集合列表的答案,但在我的案例中如何实现。 我想获取条件 api 中包含 carUsers 列表中已登录用户 ID "userId" 的所有 Cars 实体。有人可以帮忙吗?
我找到了解决方案。我已经在 isMember 函数中传递了登录用户对象 "user"。这可能对某人有帮助。
CriteriaBuilder criteriaBuilder = em.getEntityManagerFactory().getCriteriaBuilder();
CriteriaQuery<Car> criteria = criteriaBuilder.createQuery(Car.class);
Root<Car> root = criteria.from(Car.class);
criteria.where(criteriaBuilder.isMember(user, root.get(Car_.carUsers)));
List<Car> cars = em.createQuery(criteria).getResultList();