【问题标题】:hibernate @JoinTable annotation and criteria not working properlyhibernate @JoinTable 注释和标准无法正常工作
【发布时间】:2012-01-31 14:29:03
【问题描述】:

我有一个 Tag 类,它使用 TagStatus 连接表存储对状态集的引用,目前系统中没有它的实体

package com.iit.awt.application.domain;

import java.io.Serializable;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;

@Entity
@Table(name="System_Table_Tag")
public class Tag implements Serializable {

    private static final long serialVersionUID = 4142565751324734722L;

    @Id
    @Column(name="TagId")
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long tagId;

    @Column(name="TagText")
    private String tagText;

    @ManyToMany(fetch=FetchType.EAGER)
    @JoinTable(name = "System_Table_Tag_Status",
            joinColumns = {@JoinColumn(name="TagId")},
            inverseJoinColumns = {@JoinColumn(name="StatusId")})
    private List<Status> statuses;

    public Long getTagId() {
        return tagId;
    }

    public void setTagId(Long tagId) {
        this.tagId = tagId;
    }

    public String getTagText() {
        return tagText;
    }

    public void setTagText(String tagText) {
        this.tagText = tagText;
    }

    public void setStatuses(List<Status> statuses) {
        this.statuses = statuses;
    }

    public List<Status> getStatuses() {
        return statuses;
    }

}

我自动从前面动态检索数据,每当显示状态时执行此操作,存储最新状态并显示之后的所有状态(随着 id 自动递增,statusId 值更大)

这里是我的dao类函数

@Override
public List<Tag> getTagDetailsUsingTagTextWithStatusFiltering(
        String profileText, Long latestStatus) {
    Criteria criteria = super.getCurrentSession().createCriteria(Tag.class);

    if(profileText!=null && profileText!=""){
        criteria.add(Restrictions.eq("tagText", profileText));
    }

    if(latestStatus!=null){
        criteria.createAlias("statuses", "stts");
        criteria.add(Restrictions.gt("stts.statusId", latestStatus));
    }

    return criteria.list();
}

尽管它看起来工作正常,但所有状态都会返回。但是可以说最新的状态 id 37 并且没有新的状态过滤可以正常工作并且不会返回任何新的状态但是如果有一个新的状态例如状态 id 为 38 所有的状态将被返回而我只想要一个

非常感谢您尽快提供任何帮助

干杯

【问题讨论】:

    标签: java hibernate entity-relationship dao criteria-api


    【解决方案1】:

    这是意料之中的。一个 Tag 有一组状态,Tag 类中的状态集合包含所有这些状态。如果没有,并且您在标签中的状态集中添加了一个状态,您是否希望从数据库中删除所有未加载的状态?此外,您的查询会执行以下操作:

    select tag from Tag tag inner join tag.statuses status where status.statuesId > :latestStatus
    

    所以它只获取标签。然后,由于您将状态集合配置为快速获取,因此在附加查询中从数据库中加载了标记的状态集合。

    如果您想加载实体的部分视图,则不应加载实体。

    请注意,Hibernate 允许加载部分实体,但您应谨慎使用此功能,因为它非常危险。仅将这些部分实体用作只读 DTO。另请注意,其他 JPA 引擎不支持此行为。

    如果您想加载带有部分状态集的标签,您应该在单个查询中通过为状态添加获取模式来完成:

    criteria.setFetchMode("statuses", FetchMode.JOIN);
    

    【讨论】:

      猜你喜欢
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-20
      • 1970-01-01
      • 2017-09-02
      • 1970-01-01
      相关资源
      最近更新 更多