【问题标题】:Column index out of range when creating alias with criteria使用条件创建别名时列索引超出范围
【发布时间】:2013-11-26 13:10:45
【问题描述】:

好的,所以我遇到了这个我无法解决的奇怪问题。 我有 3 个实体(我会写只对 imo 重要的东西)

@Data
@Entity // all @ are in javax
@Table(name = "a", schema = "pl")
@SequenceGenerator(...)
public class A extends BaseEntity {
 @OneToMany(mappedBy = "pk.a")
    private Set<ABRel> Bs = new HashSet<ABRel>();
}

@Getter
@Setter
@Entity
@Table(name = "a_b_rel", schema = "pl")
public class ABRel implements IEntity {
    @EmbeddedId
    private OfferOrderProjectRelId pk;

    public OfferOrderProjectRel(B b, A a) {
        if (a == null || b == null) {
            throw new IllegalArgumentException("B orA equals null");
        }
        B.addA(this); // this methods just adds ABRel to sets in A and B
        A.addB(this);
        pk = new ABRelId(b, a);
    }
}

@Getter
@Setter
@Embeddable
@EqualsAndHashCode
public class OfferOrderProjectRelId implements Serializable {

    @ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.REFRESH })
    @JoinColumn(name = "b_id")
    private B b;

    @ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.REFRESH })
    @JoinColumn(name = "a_id")
    private A a;

    public ABRelId(B b, A a) {
        setB(b);
        setA(a);
    }
}

@Data
@Entity (it has javax import)
@Table(name = "b", schema = "pl")
@SequenceGenerator(...)
public class B extends BaseEntity {
 @OneToMany(mappedBy = "pk.b")
 private Set<ABRel> As = new HashSet<ABRel>();

@NotBlank
@Length(max = 10000)
@Column(name = "type", length = 10000, nullable = false)
private String type;
}

ABRel 和 ABRelId 有私有构造函数(ABRel()ABRelId()),但不确定是否重要。实体工作得很好,所以我不认为他们有问题,但我错了。

所以我正在尝试按 B.type 为我的过滤器添加条件。标准是“在”中制定的(不知道怎么说:))A.class。因此,这是我尝试在我的 dao 中添加的标准(如果有人问,我可以将其添加到未分离的标准中):

DetachedCriteria idCriteria = DetachedCriteria.forClass(A.class, "a");
idCriteria.createAlias("Bs", "btype", JoinType.LEFT_OUTER_JOIN, Restrictions.eq("Bs.pk.B.type", "someType"));
Criteria criteria = getSession().createCriteria(A.class, "a");
criteria.add(Subqueries.propertyIn("id", idCriteria));

我试图实现的是获取所有具有某些指定 B.type 的 ABRel,然后我将不得不以某种方式计算它,但这不是我的问题 atm。我必须使用标准,不能使用任何 HQL。我还读到 hibernate 在创建别名 beetwen 实体及其嵌入时存在某种错误,所以我也无法做到(可能这就是我遇到很多麻烦的原因)。那么有什么想法吗?我的选择已经不多了,所以任何帮助都会很棒!

我差点忘了,我收到了这个错误

org.hibernate.HibernateException:未知实体:null at org.hibernate.loader.criteria.CriteriaQueryTranslator.getPropertyMapping(CriteriaQueryTranslator.java:638) 在 org.hibernate.loader.criteria.CriteriaQueryTranslator.getType(CriteriaQueryTranslator.java:587) 在 org.hibernate.loader.criteria.CriteriaQueryTranslator.getTypeUsingProjection(CriteriaQueryTranslator.java:569) 在 org.hibernate.loader.criteria.CriteriaQueryTranslator.getTypedValue(CriteriaQueryTranslator.java:627) 在 org.hibernate.criterion.SimpleExpression.getTypedValues(SimpleExpression.java:100) 在 org.hibernate.loader.criteria.CriteriaQueryTranslator.getQueryParameters(CriteriaQueryTranslator.java:335) 在 org.hibernate.criterion.SubqueryExpression.createAndSetInnerQuery(SubqueryExpression.java:151) 在 org.hibernate.criterion.SubqueryExpression.toSqlString(SubqueryExpression.java:68)

更新:

我已经添加了这样的东西

criteria.createAlias("As", "oorel", JoinType.LEFT_OUTER_JOIN);
criteria.createAlias("oorel.pk.b", "order", JoinType.LEFT_OUTER_JOIN, Restrictions.eq("type", "order"));

现在我遇到了新错误(它是我的母语,所以我会尝试翻译它)它的 postgres 和休眠异常:

列索引超出范围:1,列数:0

对不起,我的英语不好,提前谢谢你。

【问题讨论】:

    标签: java hibernate jpa indexing hibernate-criteria


    【解决方案1】:

    不幸的是,这是一个尚未修复的休眠错误。出现此错误是因为 hibernate 无法通过包含复合键的实体创建别名。

    【讨论】:

      猜你喜欢
      • 2017-12-16
      • 1970-01-01
      • 2013-03-22
      • 2020-12-19
      • 2017-03-23
      • 1970-01-01
      • 2021-05-25
      • 1970-01-01
      • 2015-06-27
      相关资源
      最近更新 更多