参数像第JPQL(Parameter in like clause JPQL)

2019-06-21 05:08发布

我试图写一个类似条款JPQL查询:

LIKE '%:code%'

我想有码= 4,找到

455
554
646
...

我无法通过:code = '%value%'

namedQuery.setParameter("%" + this.value + "%");

因为在另一个地方,我需要:value不被包裹%字符。 任何帮助吗?

Answer 1:

如果你这样做

LIKE :code

然后做

namedQuery.setParameter("code", "%" + this.value + "%");

然后值保持从“%”标志免费。 如果你需要在同一个查询的其他地方使用它只需使用比“代码”之外的其他参数名称。



Answer 2:

我不使用命名参数为所有查询。 例如,它是不寻常的使用命名参数JpaRepository 。

要解决我使用JPQL CONCAT功能(此代码模拟下手 ):

@Repository
public interface BranchRepository extends JpaRepository<Branch, String> {
    private static final String QUERY = "select b from Branch b"
       + " left join b.filial f"
       + " where f.id = ?1 and b.id like CONCAT(?2, '%')";
    @Query(QUERY)
    List<Branch> findByFilialAndBranchLike(String filialId, String branchCode);
}

我发现在良好的文档这种技术: http://openjpa.apache.org/builds/1.0.1/apache-openjpa-1.0.1/docs/manual/jpa_overview_query.html



Answer 3:

您可以使用JPA LOCATE函数 。

LOCATE(searchString的,candidateString [,则startIndex]):返回搜索字符串的在candidateString第一索引。 位置是从1开始的。 如果未找到字符串,返回0。

FYI:对文档我的前谷歌打了参数逆转。

SELECT 
  e
FROM 
  entity e
WHERE
  (0 < LOCATE(:searchStr, e.property))


Answer 4:

我不知道如果我迟到或超出范围,但在我看来,我能做到这一点,如:

String orgName = "anyParamValue";

Query q = em.createQuery("Select O from Organization O where O.orgName LIKE '%:orgName%'");

q.setParameter("orgName", orgName);


Answer 5:

There is nice like() method in JPA criteria API. Try to use that, hope it will help.

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery criteriaQuery = cb.createQuery(Employees.class);
Root<Employees> rootOfQuery = criteriaQuery.from(Employees.class);
criteriaQuery.select(rootOfQuery).where(cb.like(rootOfQuery.get("firstName"), "H%"));


Answer 6:

刚刚离开了“”

LIKE %:code%


Answer 7:

  1. 使用下面JPQL查询。

从教师选择I I其中i.address LIKE CONCAT( '%',:地址, '%')“);

  1. 使用下列标准代码相同:

    }



文章来源: Parameter in like clause JPQL