【问题标题】:Using Hibernate Restrictions.in with a List<enum>将 Hibernate Restrictions.in 与 List<enum> 一起使用
【发布时间】:2012-12-24 22:40:37
【问题描述】:

如何将 Restrictions.in 用于列表字段?

这是我的模型:

@Entity
@Table(name = "W_GROUP", schema = "U_FRONTEND")
public class UserGroup {
@Id
@Column(name = "GROUP_ID")
private Long id;

@Column(name = "NAME", length = 100, nullable = false, unique = true)
private String name;

@ElementCollection(targetClass = Feature.class)
@JoinTable(name = "W_FEATURE", joinColumns = @JoinColumn(name = "GROUP_ID", nullable = false), schema = "U_FRONTEND")
@Column(name = "NAME", nullable = false, length = 50)
@Enumerated(EnumType.STRING)
private List<Feature> features;

@JoinTable(name = "W_USER_GROUP", joinColumns = @JoinColumn(name = "GROUP_ID"), inverseJoinColumns = @JoinColumn(name = "USER_ID"), schema = "U_FRONTEND")
@ManyToMany
private List<User> users;

@Column(name = "UPD_USER", nullable = false, length = 50)
private String updUser;

@Column(name = "UPD_DATE", nullable = false, columnDefinition = "date")
private Calendar updDate;
// Getters and setters
}

我正在尝试仅获取具有某些功能的组:

Criteria criteria = session.createCriteria(UserGroup.class);

            criteria.addOrder(new Sort(Order.ASC, "name").getOrder());

            criteria.add(Restrictions.not(Restrictions.in("features",
                    FeatureUtils.getInvalids())));

但这会返回错误:

原因:org.hibernate.exception.GenericJDBCException: Missing IN or OUT 参数在 index:: 1 at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:54) 在 org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125) 在 org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110) 在 org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:129) 在 org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81) 在 $Proxy35.executeQuery(未知来源) org.hibernate.loader.Loader.getResultSet(Loader.java:1926) 在 org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1727) 在 org.hibernate.loader.Loader.doQuery(Loader.java:852) 在 org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:293) 在 org.hibernate.loader.Loader.doList(Loader.java:2411) 在 org.hibernate.loader.Loader.doList(Loader.java:2397) 在 org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2227) 在 org.hibernate.loader.Loader.list(Loader.java:2222) 在 org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:122) 在 org.hibernate.internal.SessionImpl.list(SessionImpl.java:1621) 在 org.hibernate.internal.CriteriaImpl.list(CriteriaImpl.java:374) 在 hamburgsud.frontend.dao.UserGroupDAO.list(UserGroupDAO.java:39) 在 hamburgsud.frontend.controller.UserController.form(UserController.java:38) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在 java.lang.reflect.Method.invoke(Method.java:597) 在 br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:61) ... 43 更多原因:java.sql.SQLException: Missing IN or OUT 索引处的参数:: 1 at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112) 在 oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146) 在 oracle.jdbc.driver.OraclePreparedStatement.processCompletedBindRow(OraclePreparedStatement.java:1681) 在 oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3280) 在 oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3329) 在 com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:76) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在 java.lang.reflect.Method.invoke(Method.java:597) 在 org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:122) ... 63 更多

【问题讨论】:

  • 我想我也有同样的问题。 Hibernate 似乎不能很好地与 Enums in Restrictions 配合使用

标签: hibernate


【解决方案1】:

我知道这不是很漂亮,但你可以构造一个 id 列表 (List&lt;Long&gt; featureIds),然后执行以下操作:

Restrictions.in("features", featureIds);

【讨论】:

  • 但功能是一个枚举:公共枚举功能{logged_off,logged_in,user_maintenance,seller_cabotage,seller_deep_sea,seller_maintenance,parameter_maintenance,coordinator_maintenance,condinator,budget_trust_report_maintenant,import_customers,访客; public String getLabel() { return this.name().toLowerCase().replace("_", "-"); } }
猜你喜欢
  • 2011-08-19
  • 1970-01-01
  • 2011-10-28
  • 2020-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多