基于列表中的另一个实体获取主实体的限制
Restrictions to get main Entity based on another entity from a List
我在 2 个实体 UserDefinition 和 Company 之间有关系。这是我如何映射我与休眠的关系:
@OneToMany
@JoinColumn(name="COMPANY_ID",nullable=true,updatable=true)
private List<UserDefinition> users;
我的 table 中确实有一个 COMPANY_ID 列,但在 UserDefinition 实体中没有,以避免递归。这是我现在正在做的事情:
@Transactional
public Company retrieveByUser(UserDefinition user) {
return (Company) getCurrentSession().createCriteria(getClazz()).add(Restrictions.eq("users", user)).uniqueResult();
}
但是我得到一个错误,这是堆栈跟踪的一部分:
java.sql.SQLException: Missing IN or OUT parameter at index:: 1
at oracle.jdbc.driver.OraclePreparedStatement.processCompletedBindRow(OraclePreparedStatement.java:2086)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3772)
at oracle.jdbc.driver.T4CPreparedStatement.executeInternal(T4CPreparedStatement.java:1343)
at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3822)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1165)
at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:353)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:70)
at org.hibernate.loader.Loader.getResultSet(Loader.java:2122)
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1905)
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1881)
at org.hibernate.loader.Loader.doQuery(Loader.java:925)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:342)
at org.hibernate.loader.Loader.doList(Loader.java:2622)
at org.hibernate.loader.Loader.doList(Loader.java:2605)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2434)
at org.hibernate.loader.Loader.list(Loader.java:2429)
at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:109)
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1787)
at org.hibernate.internal.CriteriaImpl.list(CriteriaImpl.java:363)
at org.hibernate.internal.CriteriaImpl.uniqueResult(CriteriaImpl.java:385)
at XXXX.commons.spring.io.persistence.dao.CompanyDAO.retrieveByUser(CompanyDAO.java:25)
Restrictions.eq("users", user)
可能有问题。我怎样才能检索一个特定用户的公司?检索到这家公司后,我会将其用作公司的过滤器 - 例如Restrictions.in("userLogin", companyDao.retrieveByUser(user).getUsers())
在另一个包含 userLogin 的 table 上。感谢您的帮助:)
Restrictions.eq("users", user)
表示用户列表等于用户,所以这是不正确的,您要测试用户列表是否包含该用户。
我认为这应该更好用(为用户创建别名):
Criteria criteria= getSession().createCriteria(getClazz());
criteria.createAlias("users", "u");
criteria.add(Restrictions.eq("u.id", user.getId()));
请注意 Criteria API is deprecated 所以您可能要考虑 JPA API 或 HQL
我在 2 个实体 UserDefinition 和 Company 之间有关系。这是我如何映射我与休眠的关系:
@OneToMany
@JoinColumn(name="COMPANY_ID",nullable=true,updatable=true)
private List<UserDefinition> users;
我的 table 中确实有一个 COMPANY_ID 列,但在 UserDefinition 实体中没有,以避免递归。这是我现在正在做的事情:
@Transactional
public Company retrieveByUser(UserDefinition user) {
return (Company) getCurrentSession().createCriteria(getClazz()).add(Restrictions.eq("users", user)).uniqueResult();
}
但是我得到一个错误,这是堆栈跟踪的一部分:
java.sql.SQLException: Missing IN or OUT parameter at index:: 1
at oracle.jdbc.driver.OraclePreparedStatement.processCompletedBindRow(OraclePreparedStatement.java:2086)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3772)
at oracle.jdbc.driver.T4CPreparedStatement.executeInternal(T4CPreparedStatement.java:1343)
at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3822)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1165)
at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:353)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:70)
at org.hibernate.loader.Loader.getResultSet(Loader.java:2122)
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1905)
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1881)
at org.hibernate.loader.Loader.doQuery(Loader.java:925)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:342)
at org.hibernate.loader.Loader.doList(Loader.java:2622)
at org.hibernate.loader.Loader.doList(Loader.java:2605)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2434)
at org.hibernate.loader.Loader.list(Loader.java:2429)
at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:109)
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1787)
at org.hibernate.internal.CriteriaImpl.list(CriteriaImpl.java:363)
at org.hibernate.internal.CriteriaImpl.uniqueResult(CriteriaImpl.java:385)
at XXXX.commons.spring.io.persistence.dao.CompanyDAO.retrieveByUser(CompanyDAO.java:25)
Restrictions.eq("users", user)
可能有问题。我怎样才能检索一个特定用户的公司?检索到这家公司后,我会将其用作公司的过滤器 - 例如Restrictions.in("userLogin", companyDao.retrieveByUser(user).getUsers())
在另一个包含 userLogin 的 table 上。感谢您的帮助:)
Restrictions.eq("users", user)
表示用户列表等于用户,所以这是不正确的,您要测试用户列表是否包含该用户。
我认为这应该更好用(为用户创建别名):
Criteria criteria= getSession().createCriteria(getClazz());
criteria.createAlias("users", "u");
criteria.add(Restrictions.eq("u.id", user.getId()));
请注意 Criteria API is deprecated 所以您可能要考虑 JPA API 或 HQL