jpa合并谓词数组+;搜索外键值
我想进行如下搜索:jpa合并谓词数组+;搜索外键值,jpa,Jpa,我想进行如下搜索: Select * From Users where ( ( username Like %criteria% OR firstName Like %criteria% ...) AND (CarId = carId) ) 我将2个谓词组合到一个数组中,但只需要使用1个谓词 @Entity @Table(name = "users", uniqueConstraints = { @UniqueConstraint(columnNames = { "username" })
Select * From Users where ( ( username Like %criteria% OR firstName Like %criteria% ...) AND (CarId = carId) )
我将2个谓词组合到一个数组中,但只需要使用1个谓词
@Entity
@Table(name = "users", uniqueConstraints = { @UniqueConstraint(columnNames = { "username" }) })
public class User{
@Id
@GeneratedValue(generator = "seq_id_user", strategy = GenerationType.SEQUENCE)
@SequenceGenerator(name = "seq_id_user", sequenceName = "seq_id_user")
private Long id;
@Column(unique = true)
@NotNull
private String username;
@Column(name = "first_name")
private String firstName;
....
@ManyToOne
@JoinColumn(name = "car_id", nullable = false, foreignKey = @ForeignKey(name = "CAR_ID_FK"))
private Car car;
...
该车为同类车型,用户有1把外键
@Override
public List<User> searchUsers(String criteria, Car car) {
//TODO: check params and return values based on test cases
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<User> query = builder.createQuery(User.class);
Root<User> r = query.from(User.class);
Predicate predicate = builder.conjunction();
predicate = builder.or(predicate, builder.like(r.get("username"), "%" + criteria + "%"));
predicate = builder.or(predicate, builder.like(r.get("firstName"), "%" + criteria + "%"));
predicate = builder.or(predicate, builder.like(r.get("lastName"), "%" + criteria + "%"));
predicate = builder.or(predicate, builder.like(r.get("nickname"), "%" + criteria + "%"));
// how to implement the filter by foreign key value with AND? - can be a sub query to, which will be executed first time
// I need to use 1 Predicate, not a Predicate Array!
query.select(r).where(predicate);
List<User> result = entityManager.createQuery(query).getResultList();
@覆盖
公共列表搜索用户(字符串条件、汽车){
//TODO:根据测试用例检查参数和返回值
CriteriaBuilder=entityManager.getCriteriaBuilder();
CriteriaQuery=builder.createQuery(User.class);
Root r=query.from(User.class);
谓词=builder.conjunction();
谓词=builder.or(谓词,builder.like(r.get(“用户名”),“%”+条件+“%”);
谓词=builder.or(谓词,builder.like(r.get(“firstName”),“%”+条件+“%”);
谓词=builder.or(谓词,builder.like(r.get(“lastName”),“%”+条件+“%”);
谓词=builder.or(谓词,builder.like(r.get(“昵称”),“%”+条件+“%”);
//如何实现带和的按外键值过滤?可以是对的子查询,将第一次执行
//我需要使用1个谓词,而不是谓词数组!
query.select(r).where(谓词);
List result=entityManager.createQuery(query.getResultList();