Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java hibernate@JoinTable注释和条件工作不正常_Java_Hibernate_Entity Relationship_Dao_Criteria Api - Fatal编程技术网

Java hibernate@JoinTable注释和条件工作不正常

Java hibernate@JoinTable注释和条件工作不正常,java,hibernate,entity-relationship,dao,criteria-api,Java,Hibernate,Entity Relationship,Dao,Criteria Api,我有一个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

我有一个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;
    }

}
包com.iit.awt.application.domain;
导入java.io.Serializable;
导入java.util.List;
导入javax.persistence.Column;
导入javax.persistence.Entity;
导入javax.persistence.FetchType;
导入javax.persistence.GeneratedValue;
导入javax.persistence.GenerationType;
导入javax.persistence.Id;
导入javax.persistence.JoinColumn;
导入javax.persistence.JoinTable;
导入javax.persistence.ManyToMany;
导入javax.persistence.Table;
@实体
@表(name=“系统\表\标签”)
公共类标记实现可序列化{
私有静态最终长serialVersionUID=4142565751324734722L;
@身份证
@列(name=“TagId”)
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长标签;
@列(name=“TagText”)
私有字符串标记文本;
@ManyToMany(fetch=FetchType.EAGER)
@JoinTable(name=“系统\表格\标签\状态”,
joinColumns={@JoinColumn(name=“TagId”)},
inverseJoinColumns={@JoinColumn(name=“StatusId”)}
私有列表状态;
公共长getTagId(){
返回标记ID;
}
公共无效setTagId(长标记ID){
this.tagId=tagId;
}
公共字符串getTagText(){
返回标记文本;
}
公共void setTagText(字符串tagText){
this.tagText=tagText;
}
公共无效设置状态(列表状态){
this.statuses=状态;
}
公共列表getStatuses(){
返回状态;
}
}
我自动从前端动态检索数据,以便在显示状态时执行此操作,存储最新状态,并显示之后的所有状态(随着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();
}
@覆盖
公共列表getTagDetailsUsingTagTextWithStatusFiltering(
字符串配置文件(文本,最新状态){
Criteria=super.getCurrentSession().createCriteria(Tag.class);
如果(profileText!=null&&profileText!=“”){
标准.添加(限制.eq(“tagText”,profileText));
}
如果(最新状态!=null){
createAlias(“状态”、“STT”);
添加(Restrictions.gt(“stts.statusId”,latestStatus));
}
返回条件。list();
}
即使它看起来工作正常,所有状态都会返回。但是,假设最新的状态id为37,并且没有新的状态,过滤将正常工作,不会返回任何新的状态,但是如果有新的状态,例如状态id为38,则将返回所有状态,而我只需要一个

非常感谢您能尽快提供帮助


干杯

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

select tag from Tag tag inner join tag.statuses status where status.statuesId > :latestStatus
所以它只获取标签。然后,由于您配置了要提取的状态集合,因此在另一个查询中,将从数据库加载标记的状态集

如果要加载实体的局部视图,则不应加载实体

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

如果要加载带有部分状态集的标记,应在单个查询中完成,方法是为状态添加获取模式:

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