【问题标题】:Solve JPQL Query解决 JPQL 查询
【发布时间】:2021-01-14 16:01:15
【问题描述】:

我正在尝试使用 JPQL 从数据库中获取属性详细信息的详细信息,听说我正在写 where 条件,如 (properties.IsDeleted 'Y' or properties.IsDeleted IS NULL) 但是,在 JPQL 查询中它没有得到 'Y',而是显示为 '?' 符号。这是我遇到的问题。请帮助我解决这个问题。

下面的代码显示如下查询:-

选择 properties0_.property_id 作为 col_0_0_, properties0_.property_type 作为 col_1_0_,property0_.property_name 作为 col_2_0_, properties0_.property_area 作为 col_3_0_, properties0_.property_city 作为 col_4_0_,properties0_.no_of_rooms 作为 col_5_0_ 来自 iot_property properties0_ 其中 (properties0_.is_deleted? 或 properties0_.is_deleted 为空)和 properties0_.property_id=6

在上面的查询中以粗体标记显示 properties0_.is_deleted? ,但我想要的是 properties0_.is_deletedY

为什么没有将 "Y" 分配给该查询。我不明白。 请你帮我解决这个问题。 谢谢

 CriteriaBuilder deviceBuilder = propertySession.getCriteriaBuilder();
                    CriteriaQuery<Object[]> userCriteriaQuery = deviceBuilder.createQuery(Object[].class);
                    Root<Properties> propertyRoot = userCriteriaQuery.from(Properties.class);
                    Path<Object> pathPropertyId = propertyRoot.get("propertyId");
                    Path<Object> pathpropertyType = propertyRoot.get("propertyType");
                    Path<Object> pathpropertyName = propertyRoot.get("propertyName");
                    Path<Object> pathpropertyArea = propertyRoot.get("propertyArea");
                    Path<Object> pathpropertyCity = propertyRoot.get("propertyCity");
                    Path<Object> pathnumberOfRooms = propertyRoot.get("numberOfRooms");
                    userCriteriaQuery.multiselect(pathPropertyId, pathpropertyType, pathpropertyName, pathpropertyArea,
                            pathpropertyCity, pathnumberOfRooms);

Predicate userRestriction = deviceBuilder.or(deviceBuilder.notEqual(propertyRoot.get("isDelete"), "Y"),
                        deviceBuilder.isNull(propertyRoot.get("isDelete")));
                Predicate userRestriction2 = deviceBuilder
                        .and(deviceBuilder.equal(propertyRoot.get("propertyId"), propertyId));
                userCriteriaQuery.where(deviceBuilder.and(userRestriction, userRestriction2));
                
                Query<Object[]> deviceQuery = propertySession.createQuery(userCriteriaQuery);
                List<Object[]> resultList =deviceQuery.getResultList();
                for(Object[] objects : resultList) {
                    Integer dbPropertyId = (Integer) objects[0];
                    String dbPropertyType = (String) objects[1];
                    String  dbpropertyName = (String) objects[2];
                    String dbpropertyArea = (String) objects[3];
                    String dbpropertyCity = (String) objects[4];
                    Integer dbNoOfRooms = (Integer) objects[5];
                    System.out.println(dbPropertyId);
                    System.out.println(dbPropertyType);
                    System.out.println(dbpropertyName);
                    System.out.println(dbpropertyArea);
                    System.out.println(dbpropertyCity);
                    System.out.println(dbNoOfRooms);
                }

【问题讨论】:

    标签: java hibernate jpql


    【解决方案1】:

    没有“最终的 JPQL 最终被翻译成带有插入参数的最终 SQL”这样的东西。 JPA 实现如何生成 SQL 取决于它,并且参数通常不会被替换为任何字符串。 SQL 是从表达式树等生成的,而不是字符串。这是一个条件查询,因此对于参数,它将在控制台上显示 "?"

    如果您想插入参数值,请自己做,因为它只对您有意义

    【讨论】:

      猜你喜欢
      • 2012-09-21
      • 2021-08-30
      • 2017-03-10
      • 2013-11-13
      • 2011-07-30
      • 2021-04-06
      • 2017-11-30
      • 2013-06-16
      • 2011-09-17
      相关资源
      最近更新 更多