如何映射属性仅用于HQL(在Hibernate中)?

Man*_*gra 5 java orm hibernate

我有一张这样的桌子:

id | name | score
Run Code Online (Sandbox Code Playgroud)

使用Hibernate通过XML映射到POJO.分数列我只需要oder byHQL中的in 子句.score列的值由算法计算,并通过SQL批处理(JDBC)每24小时更新一次.所以我不想用我在运行时不需要的属性来污染我的POJO.

对于可能不是问题的单个列,但我有几个不同的分数列.有没有办法只为HQL使用映射属性?

例如这样:

<property name="score" type="double" ignore="true"/>
Run Code Online (Sandbox Code Playgroud)

所以我仍然可以这样做:

from Pojo p order by p.score
Run Code Online (Sandbox Code Playgroud)

但我的POJO实现可能如下所示:

public class Pojo
{
  private long id;

  private String name;

  // ... 
}
Run Code Online (Sandbox Code Playgroud)

没有为score实现添加提供或属性的Setter .

使用最新的Hibernate版本的Java.

更新:

在完美的世界中,它可以这样做(感谢Pascal Thivent):

<property name="score" access="noop" insert="false" update="false"/>
Run Code Online (Sandbox Code Playgroud)

但在我们的现实世界中存在一个多年来似乎没有人关心的错误.那么有没有人有解决方法的建议?

Pas*_*ent 3

您可以access="noop"在映射中使用来指定仅查询属性(这是一个秘密的、未记录的功能,请参阅HHH-552):

<property name="score" access="noop" insert="false" update="false" ... />
Run Code Online (Sandbox Code Playgroud)

更新:只是为了澄清,使用以下实体:

public class EntityWithHqlOnlyProperty implements Serializable {
    private Long id;
    private String name;

    //...
}
Run Code Online (Sandbox Code Playgroud)

这个映射:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.stackoverflow.q2812672.EntityWithHqlOnlyProperty" table="EntityWithHqlOnlyProperty">
        <id name="id" type="java.lang.Long">
            <column name="id" />
            <generator class="assigned" />
        </id>
        <property name="name" type="string">
            <column name="name" not-null="true" />
        </property>
        <property name="score" type="double" access="noop" insert="false" update="false"/>
    </class>
</hibernate-mapping>
Run Code Online (Sandbox Code Playgroud)

以下片段:

 Query q = session.createQuery("from EntityWithHqlOnlyProperty e order by e.score");
 List<EntityWithHqlOnlyProperty> resultList = q.list();
 assertNotNull(resultList);
Run Code Online (Sandbox Code Playgroud)

生成以下 SQL:

select 
  entitywith0_.id as id6_, 
  entitywith0_.name as name6_, 
  entitywith0_.score as score6_ 
 from 
  EntityWithHqlOnlyProperty entitywith0_ 
 order by
  entitywith0_.score
Run Code Online (Sandbox Code Playgroud)

我的现实世界中,测试刚刚通过。这已经在 Derby 和 HSQLDB 上使用 Hibernate Core 3.3.2.GA 进行了测试。换句话说,它可以在我的机器(c)上运行。

如果它不适合你 - 我无意粗鲁,但在完美的世界中,你应该提供一个测试用例,允许按照要求重现HHH-2925 3 年以上。提供一种重现问题的方法(我不能)可以大大增加解决问题的机会。