通过HQL(Hibernate)选择枚举集合类型的实体属性

通过HQL(Hibernate)选择枚举集合类型的实体属性,hibernate,hql,Hibernate,Hql,我们正在使用java+hibernate设置,我的实体和枚举如下所示: @Entity @Table(indexes = {@javax.persistence.Index(columnList = "sendDate", name = "foo_bar_idx"),...}) @EntityDomain(EntityType.Message) public class Message extends AuditedClass { /** * The Types.

我们正在使用java+hibernate设置,我的实体和枚举如下所示:

@Entity
@Table(indexes = {@javax.persistence.Index(columnList = "sendDate", name = "foo_bar_idx"),...})
@EntityDomain(EntityType.Message)
public class Message extends AuditedClass {

    /**
     * The Types.
     */
    @Enumerated(EnumType.STRING)
    @ElementCollection
    @Cascade(org.hibernate.annotations.CascadeType.ALL)
    List<MessageType> types;


    @JsonSerialize(using = LocalDateTimeSerializer.class)
    @JsonDeserialize(using = LocalDateTimeDeserializer.class)
    @Type(type = "org.jadira.usertype.dateandtime.joda.PersistentLocalDateTime")
    LocalDateTime sendDate;

    //more attributes
    ...
    //getters and setters
    ...
}

public enum MessageType{
    VALUE_1,
    VALUE_2;
}
但我得到了一个错误:

org.hibernate.QueryException: not an entity [select m.sendDate, m.types from mydomain.message.Message m]
我做错了什么?还有其他想法吗?冬眠5.0.11

更新:

根据要求,以下是查询代码的要点:

//imports
...
@Component("messageService")
@Transactional
public class MessageServiceImpl extends GenericHibernateServiceImpl implements MessageService {
    //@Autewired services
    ...
    //    other methods
    ...

    @Override
    public List<Foo> getFoos(/*inconsequential arguments*/) {

        List<Foo> list = new Vector<Foo>();
        try {
            Query query = getCurrentSession().createQuery("select m.sendDate, m.types from Message m");
            //execution does not reach here, error is thrown on the row above
        }
        catch (Throwable t) {
            //log and stuff
        }

        return list;
    }

    //    more methods
    ...
}
它是弹簧控制器自动接线和使用的方法的一部分

更新2-根据要求进行stacktrace:

Exception: not an entity [select m.sendDate, m.types from cz.trask.edoceo.domain.message.Message m]. StackTrace: org.hibernate.QueryException: not an entity [select m.sendDate, m.types from cz.trask.edoceo.domain.message.Message m]
    at org.hibernate.QueryException.generateQueryException(QueryException.java:120)
    at org.hibernate.QueryException.wrapWithQueryString(QueryException.java:103)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:218)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:142)
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:115)
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:76)
    at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:150)
    at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:302)
    at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:240)
    at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1894)
    at cz.trask.edoceo.service.impl.MessageServiceImpl.getFoos(MessageServiceImpl.java:388)
    //over 100 traces
    at org.eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.java:93)
    at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.executeProduceConsume(ExecuteProduceConsume.java:303)
    at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceConsume(ExecuteProduceConsume.java:148)
    at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:136)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:671)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:589)
    at java.lang.Thread.run(Thread.java:748)
Caused by: org.hibernate.QueryException: not an entity
    at org.hibernate.hql.internal.ast.tree.FromElementType.renderIdentifierSelect(FromElementType.java:174)
    at org.hibernate.hql.internal.ast.tree.FromElement.renderIdentifierSelect(FromElement.java:208)
    at org.hibernate.hql.internal.ast.tree.SelectClause.renderNonScalarIdentifiers(SelectClause.java:465)
    at org.hibernate.hql.internal.ast.tree.SelectClause.renderNonScalarSelects(SelectClause.java:421)
    at org.hibernate.hql.internal.ast.tree.SelectClause.initializeExplicitSelectClause(SelectClause.java:244)
    at org.hibernate.hql.internal.ast.HqlSqlWalker.useSelectClause(HqlSqlWalker.java:920)
    at org.hibernate.hql.internal.ast.HqlSqlWalker.processQuery(HqlSqlWalker.java:688)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:673)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:309)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:257)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:262)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:190)
    ... 122 more
, user=sysadmin, entityType=null, entityId=null

重写查询以连接具有以下类型的邮件:

select m.sendDate, t from Message m join m.types t

您在主hibernate xml文件中声明了吗?没有。我们正在使用minimalistic.xml文件,同时通过代码注释管理所有内容。到目前为止,我们以这种方式处理所有问题。我不想打破惯例-是否有必要编辑配置?能否显示getCurrentSession.createQueryqueryString;的全部代码@Dherik问题已更新,以包括请求的code@user2522115Foo类的内容是什么?您需要一个Foo类,在Foo构造函数上有两个参数来接收m.sendDate、m.types。Like:从消息m中选择new com.package.Foom.sendDate、m.types。还可以使用对象数组,如:List=newvector;和mantain相同的jpql。试着告诉我发生了什么事
select m.sendDate, t from Message m join m.types t