我是使用 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 ?