HIbernate JPA 查询助手加入 NullPointerException

问题描述 投票:0回答:0

我是使用 JPA/Hibernate 使用连接等创建查询的新手,我正在努力设置我的

Join<X,Y>
的两侧并以空指针异常结束,或者如果我使用元模型对象,它会抛出非法参数异常.

这是我的基本查询:

SELECT
 item_ID 
FROM clr.inventoryItem INNER JOIN clr.dataFlume ON dataFlume.inventoryItem_item_ID = item_ID 
WHERE recordDate >= DATE_SUB(NOW(), INTERVAL (SELECT ruleHour FROM clr.dataType WHERE typeName = 'Flume') HOUR)
GROUP BY item_ID
HAVING SUM(dataflume.flowQuantity) >= (SELECT ruleVolume FROM clr.dataType WHERE typeName = 'Flume');

库存项目模型:

@Table()
@Entity
public class InventoryItem implements Persistent<Long> {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long item_ID;
//Omitted the Rest

DataFlume模型:

@Table()
@Entity
public class DataFlume implements Persistent<Long> {
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
    private InventoryItem inventoryItem;

    @Column
    private double flowQuantity;
//Omitted the rest

我尝试通过 JPA 查询重新创建基本查询:

public List<InventoryItem> findFlumesToPowerOn(final Date ruleHour, final Integer ruleVolume){
        Map<String, Object> params = new HashMap<String, Object>();
        params.put("recordDate", ruleHour);
        params.put("flowQuantity", ruleVolume);
        List<InventoryItem> results = doUncachedQuery(
                InventoryItem.class, 0, Integer.MAX_VALUE,
                new JpaQueryHelper.Criteria<InventoryItem>() {
                    @Override
                    public void buildCriteria(CriteriaQuery<InventoryItem> criteriaQuery, CriteriaBuilder criteriaBuilder, Root<InventoryItem> queryRoot) {
                        Join<InventoryItem, DataFlume> flumeItem = queryRoot.join("item_ID");
                        criteriaQuery.where(
                                criteriaBuilder.equal(flumeItem.get(DataFlume_.inventoryItem), InventoryItem_.item_ID),
                                criteriaBuilder.greaterThanOrEqualTo(flumeItem.get(DataFlume_.recordDate), ruleHour));
                        criteriaQuery.groupBy(flumeItem.get(DataFlume_.inventoryItem));
                        criteriaQuery.having(criteriaBuilder.greaterThanOrEqualTo(criteriaBuilder.sum(flumeItem.get(DataFlume_.flowQuantity)),  ruleVolume.doubleValue()));
                    }
                }, params);
        return results;
    }

我也试过使用元模型:

Join<InventoryItem, DataFlume> flumeItem = queryRoot.join(String.valueOf(InventoryItem_.item_ID));

这样做会导致错误:

java.lang.IllegalArgumentException: Attribute "org.apache.openjpa.persistence.meta.Members$SingularAttributeImpl@3c6c5be1" of any not found in com.cdotech.clr.shared.model.InventoryItem

*编辑 我将

.getName()
方法添加到 join 方法现在接受的元模型对象中,但仍然缺少一些东西..

Join<InventoryItem, DataFlume> flumeItem = queryRoot.join(InventoryItem_.item_ID.getName(), JoinType.INNER);

但是,这是将连接添加到查询中的方式

SELECT i FROM InventoryItem i INNER JOIN i.item_ID ?
java hibernate jpa
© www.soinside.com 2019 - 2024. All rights reserved.