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
Hibernate 连接字段上的JPA查询筛选器_Hibernate_Jpa_Jpa 2.0_Criteria Api - Fatal编程技术网

Hibernate 连接字段上的JPA查询筛选器

Hibernate 连接字段上的JPA查询筛选器,hibernate,jpa,jpa-2.0,criteria-api,Hibernate,Jpa,Jpa 2.0,Criteria Api,我想使用“姓名+姓氏”字符串作为键查询我的“客户”表 姓名和姓氏存储在不同的字段中 所以我的问题是: SELECT * FROM customers WHERE CONCAT(name,' ',surname) LIKE '%term%' OR CONCAT(surname,' ',name) LIKE '%term%' 但是,我不能这样做,我的查询是JPA2条件查询。比如: CriteriaBuilder cb = getEntityManager().

我想使用“姓名+姓氏”字符串作为键查询我的“客户”表

姓名和姓氏存储在不同的字段中

所以我的问题是:

SELECT 
   * 
FROM 
   customers 
WHERE 
   CONCAT(name,' ',surname) LIKE '%term%' 
   OR CONCAT(surname,' ',name) LIKE '%term%' 
但是,我不能这样做,我的查询是JPA2条件查询。比如:

CriteriaBuilder cb = getEntityManager().getCriteriaBuilder();
            CriteriaQuery cq = cb.createQuery();
            Root<Customer> from = cq.from(Customer.class);
            cq.select(from);

            Predicate whereClause = cb.or(
                cb.like(from.<String>get("name"), "%"+ r +"%"),
                cb.like(from.<String>get("surname"), "%"+ r +"%"),
            );

            cq.where(whereClause);      
            TypedQuery<Customer> query = getEntityManager().createQuery(cq);
            list = query.getResultList();
CriteriaBuilder cb=getEntityManager().getCriteriaBuilder();
CriteriaQuery cq=cb.createQuery();
Root-from=cq.from(Customer.class);
cq.选择(从中);
谓词where子句=cb.or(
cb.like(from.get(“name”),“%”+r+“%”),
cb.like(from.get(“姓氏”),“%”+r+“%”,
);
cq.where(where条款);
TypedQuery query=getEntityManager().createQuery(cq);
list=query.getResultList();
如何根据姓名和姓氏组合筛选结果集?

使用:

表达式exp1=cb.concat(from.get(“name”),“”); exp1=cb.concat(exp1,from.get(“姓氏”); 表达式exp2=cb.concat(from.get(“姓氏”),“”); exp2=cb.concat(exp2,from.get(“name”)); 谓词where子句=cb.or(cb.like(exp1,“%”+r+“%”),cb.like(exp2,“%”+r+“%”);
如果您的数据库支持CONCAT_WS(带分隔符的CONCAT),您可以执行以下操作:表达式名称CONCAT=cb.function(“CONCAT_WS”,String.class,cb.literal(“”),from.get(“name”),from.get(“姓氏”);我希望在concat中有一个分隔符,但有些字段是空的或null,将这些字段链接在一起会在concat中添加空格,而当有空格时,我不希望这样做。
Expression<String> exp1 = cb.concat(from.<String>get("name"), " ");
exp1 = cb.concat(exp1, from.<String>get("surname"));
Expression<String> exp2 = cb.concat(from.<String>get("surname"), " ");
exp2 = cb.concat(exp2, from.<String>get("name"));
Predicate whereClause = cb.or(cb.like(exp1, "%"+ r +"%"), cb.like(exp2, "%"+ r +"%"));