【问题标题】:Hibernate xml mapping list ordered by DateHibernate xml映射列表按日期排序
【发布时间】:2015-06-17 08:37:07
【问题描述】:

我有两个 DAO。一是使用注解映射实体,二是hibernate使用xml。我有两个实体。 新闻.java:

@Entity
@Table(name = "NEWS")
public class News implements Serializable{
    /**
     * serialVersionUID
     */
    private static final long serialVersionUID = 883279937885116359L;
    /**
     * News id
     */
    @Id
    @GeneratedValue(generator = "news_seq")
    @SequenceGenerator(name="news_seq", sequenceName="NEWS_SEQ",allocationSize=1)
    @Column(name = "NEWS_ID", nullable = false, unique = true)
    private Long id;
    /**
     * News short text
     */
    @Column(name = "SHORT_TEXT")
    private String shortText;
    /**
     * News full text
     */
    @Column(name = "FULL_TEXT")
    private String fullText;
    /**
     * News title
     */
    @Column(name = "TITLE")
    private String title;
    /**
     * News creation date
     */
    @Column(name = "CREATION_DATE")
    private Date creationDate;
    /**
     * News modification date
     */
    @Column(name = "MODIFICATION_DATE")
    private Date modificationDate;
    /**
     * News author
     */
    @ManyToOne(cascade = CascadeType.REMOVE, fetch = FetchType.EAGER)
    @JoinTable(
            name = "NEWS_AUTHOR",
            joinColumns = {@JoinColumn(name = "NEWS_ID")},
            inverseJoinColumns =  {@JoinColumn(name = "AUTHOR_ID")}
    )
    private Author author;
    /**
     * News comments
     */
    @OneToMany(cascade = CascadeType.ALL, orphanRemoval= true)
    @JoinColumn(name = "NEWS_ID")
    @OrderBy("creationDate DESC")
    private List<Comment> comments;

评论.java:

@Entity
@Table(name = "COMMENTS")
public class Comment implements Serializable{
    /**
     * serialVersionUID
     */
    private static final long serialVersionUID = -5697896094322498108L;
    /**
     * Comment id
     */
    @Id
    @GeneratedValue(generator = "comment_seq")
    @SequenceGenerator(name="comment_seq", sequenceName="COMMENTS_SEQ",allocationSize=1)
    @Column(name = "COMMENT_ID", nullable = false, unique = true)
    private Long id;
    /**
     * Comment text
     */
    @Column(name = "COMMENT_TEXT")
    private String commentText;
    /**
     * Comment creation date
     */
    @Column(name = "CREATION_DATE")
    private Date creationDate;
    /**
     * Id of the news which the comment is added to
     */
    @ManyToOne(cascade = CascadeType.REMOVE, fetch = FetchType.EAGER)
    @JoinColumn(name = "NEWS_ID")
    private News news;

还有xml映射。

<class name="news.entity.News" table="NEWS">
    <id name="id" type="java.lang.Long">
        <column name="NEWS_ID"/>
        <generator class="sequence">
            <param name="sequence">NEWS_SEQ</param>
        </generator>
    </id>
        <property name="title" column="TITLE" />
        <property name="shortText" column="SHORT_TEXT" />
        <property name="fullText" column="FULL_TEXT" />
        <property name="creationDate" type="java.util.Date" column="CREATION_DATE" />
        <property name="modificationDate" type="java.util.Date" column="MODIFICATION_DATE" />

        <list name="comments" access="field" cascade="all" >
            <key column="news_id" not-null="true" />
            <index column="comment_id" />
            <one-to-many class="com.epam.news.entity.Comment" />

        </list>

        <join table="NEWS_AUTHOR" inverse="true">
            <key column="NEWS_ID"/>
            <many-to-one name="author" column="AUTHOR_ID" not-null="true"/>
        </join>
    </class>

<class name="news.entity.Comment" table="COMMENTS">
        <id name="id" type="java.lang.Long">
            <column name="COMMENT_ID"/>
            <generator class="sequence">
                <param name="sequence">COMMENT_SEQ</param>
            </generator>
        </id>
        <property name="commentText" column="COMMENT_TEXT" />
        <property name="creationDate" column="CREATION_DATE" />
        <many-to-one name="news" fetch="select" column="news_id" cascade="all" insert="false" update="false"/>

    </class>

但我在 news.cmets 中有很多 null 元素(我知道为什么),它们按 comment_id 排序。我可以有没有空元素并按评论 CREATION_DATE 排序的 cmets 列表吗?我只需要使用 xml。

【问题讨论】:

  • news.comments 中的空元素是什么意思?怎么会这样?
  • @DraganBozanovic Hibernate 手表 。所以如果news只有1条id=3的评论,那么news.cmets就是[null,null,null,[3,"text",Date,news]](hibernate以0开头)
  • 我不确定我是否完全理解。是您方面的某种性能优化吗?为什么索引会指向不存在的数据?不过,请看我的回答,也许会有所帮助。
  • 它的休眠功能(如我所读)。我认为这是因为我们可以编写 news.cmets.get(comment_id) 来查找具有此类 id 的评论。而 null 只是填补空白。
  • 有趣,可能有用。我不知道有这样的功能。

标签: java xml hibernate


【解决方案1】:

看起来您可以使用whereorder-by 映射元素,如documentation 中所述。

您可以使用where 过滤掉空值,并使用order-by 进行排序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-05
    • 1970-01-01
    • 2017-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多