【发布时间】:2019-04-24 02:05:48
【问题描述】:
我目前正在开展一个项目,将一些遗留的 jdbc 选择语句转移到使用 Hibernate 及其标准 api。
两个相关的表列和 SQL 查询看起来像:
-QUERIES-
primaryId
-QUERYDETAILS-
primaryId
linkedQueryId -> Foreign key references queries.primaryId
value1
value2
select *
from queries q
where q.primaryId not in (SELECT qd.linkedQueryId
FROM querydetails qd
WHERE (qd.value1 LIKE 'PROMPT%'
OR qd.value2 LIKE 'PROMPT%'));
我的实体关系如下:
@Table("queries")
public class QueryEntity{
@Id
@Column
private Long primaryId;
@OneToMany(targetEntity = QueryDetailEntity.class, mappedBy = "query", fetch = FetchType.EAGER)
private Set<QueryDetailEntities> queryDetails;
//..getters/setters..
}
@Entity
@Table(name = "queryDetails")
public class QueryDetailEntity {
@Id
@Column
private Long primaryId;
@ManyToOne(targetEntity = QueryEntity.class)
private QueryEntity query;
@Column(name="value1")
private String value1;
@Column(name="value2")
private String value2;
//..getters/setters..
}
我正在尝试以这种方式使用标准 api:
Criteria crit = sessionFactory.getCurrentSession().createCriteria(QueryEntity.class);
DetachedCriteria subQuery = DetachedCriteria.forClass(QueryDetailEntity.class);
LogicalExpression hasPrompt = Restrictions.or(Restrictions.ilike("value1", "PROMPT%"),
Restrictions.ilike("value2", "PROMPT%"));
subQuery.add(hasPrompt);
Criterion subQueryCrit = Subqueries.notIn("queryDetails", subQuery);
crit.add(subQueryCrit);
List<QueryMainEntity> entities = (List<QueryMainEntity>) crit.list();
System.out.println("# of results = " + entities.size());
我在 crit.list() 行上得到一个 NullPointerException,看起来像
Exception in thread "main" java.lang.NullPointerException
at org.hibernate.loader.criteria.CriteriaQueryTranslator.getProjectedTypes(CriteriaQueryTranslator.java:362)
at org.hibernate.criterion.SubqueryExpression.createAndSetInnerQuery(SubqueryExpression.java:153)
at org.hibernate.criterion.SubqueryExpression.toSqlString(SubqueryExpression.java:69)
at org.hibernate.loader.criteria.CriteriaQueryTranslator.getWhereCondition(CriteriaQueryTranslator.java:380)
at org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:114)
at org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:83)
at org.hibernate.loader.criteria.CriteriaLoader.<init>(CriteriaLoader.java:92)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1687)
at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:347)
现在,我认为可以肯定地说我错误地使用了 Criteria Api/Detached Query Api,但我不确定“正确”的做法是什么,因为 Hibernate Docs 仅简要介绍了标准api 子查询。
我意识到这是一个很长的问题,但我认为它似乎把问题的所有相关方面都放在了问题上(我试图通过 Criteria API、表、实体表示的查询)。
【问题讨论】: