Hibernate条件查询

时间:2017-06-02 13:22:52

标签: oracle hibernate

Hello stackoverflow社区。

我在尝试为Hibernate构建条件查询时遇到了困难。我在ui上有一个搜索表单,它带有不同的参数,例如客户姓名,姓氏和他/她的财务信息 - 帐号,从日期开始有效等。

主要有2个表:一个包含个人信息,另一个包含客户的财务信息。问题是该查询应首先检查客户的个人信息字段,然后检查财务信息是否为空。如果它不为null,则应根据客户输入的字段在财务表中查找客户ID。如果财务数据字段为空,则应该在个人信息表中显示任何ID,因为我们要检查所有客户是否匹配输入的个人信息字段(姓名,姓氏,移动)。

SELECT * FROM CUSTOMER c WHERE c.ID IN (SELECT c.ID FROM Customer c WHERE 
(:firstName IS NULL OR LOWER(c.FIRSTNAME) LIKE :firstName)
AND (:lastName IS NULL OR LOWER(c.LASTNAME) LIKE :lastName)
AND (:mobileNum IS NULL OR LOWER(c.MOBILENUM)LIKE :mobileNum) AND c.ID IN
(SELECT a.FK_CUSTOMER_ID CASE WHEN (a.ACCOUNTNUMBER NOT NULL OR VALIDFROM NOT NULL OR VALIDTO NOT NULL)
THEN a.FK_CUSTOMER_ID IN (SELECT a.FK_CUSTOMER_ID FROM ACCOUNT a WHERE
(:accountNumber IS NULL OR a.ACCOUNTNUMBER LIKE :accountNumber)
AND (:validFrom IS NULL OR a.VALIDFROM LIKE :validFrom)
AND (:validTo IS NULL OR a.VALIDTO LIKE :validTo)) END FROM ACCOUNT a));

我认为存在一些语法错误,但我无法弄清楚哪一个错误。

更新: 实际上@ OldProgrammer是对的我错误地发布了sql developer的查询,当时我试图了解出了什么问题。实际上我在java代码中修改了我的查询,以避免在处理日期时出错 所以我的修改后的代码如下所示:

    public List<Customer> findBySearchCriteria(SearchCriteria 
    searchCriteria) {
    StringBuilder temp = new StringBuilder("SELECT DISTINCT c FROM Customer 
    c LEFT JOIN c.accountList ac WHERE (:firstName IS NULL OR 
    LOWER(c.firstName) LIKE :firstName) AND (:lastName IS NULL OR 
    LOWER(c.lastName) LIKE :lastName) AND (:mobileNum IS NULL OR 
    LOWER(c.mobileNum) LIKE :mobileNum) AND (:accountNumber IS NULL OR 
    LOWER(ac.accountNumber) LIKE :accountNumber)");

    if (searchCriteria.getAccountValidFrom() != null) {
        temp.append("AND (ac.validFrom between :validFrom AND :validFromEndPoint)");
    }
    if (searchCriteria.getAccountValidTo() != null) {
        temp.append("AND (ac.validTo between :validTo AND :validToEndPoint)");
    }

    Query namedQuery = entityManager.createQuery(temp.toString(), Customer.class)
            .setParameter("firstName", searchCriteria.getFirstNameCriteria() == null ?
                    null : "%" + searchCriteria.getFirstNameCriteria().trim().toLowerCase() + "%")
            .setParameter("lastName", searchCriteria.getLastNameCriteria() == null ?
                    null : "%" + searchCriteria.getLastNameCriteria().trim().toLowerCase() + "%")
            .setParameter("mobileNum", searchCriteria.getMobileNumCriteria() == null ?
                    null : "%" + searchCriteria.getMobileNumCriteria().trim().toLowerCase() + "%")
            .setParameter("accountNumber", searchCriteria.getAccountNumCriteria() == null ?
                    null : "%" + searchCriteria.getAccountNumCriteria().toString() + "%");

    if (searchCriteria.getAccountValidFrom() != null) {
        namedQuery.setParameter("validFrom", searchCriteria.getAccountValidFrom())
                .setParameter("validFromEndPoint", searchCriteria.getAccountValidFromEndPoint());
    }

    if (searchCriteria.getAccountValidTo() != null) {
        namedQuery.setParameter("validTo", searchCriteria.getAccountValidTo())
                .setParameter("validToEndPoint", searchCriteria.getAccountValidToEndPoint());
    }

    return namedQuery.getResultList();
}

它不是很好看,因为我必须检查两次才能构建查询:第一次动态附加查询和第二次设置参数。

如何改进此类功能的建议将不胜感激。

0 个答案:

没有答案