Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
jpa合并谓词数组+;搜索外键值_Jpa - Fatal编程技术网

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();