hibernate返回的行数多于预期

时间:2012-05-30 13:59:41

标签: hibernate

我的查询在使用sql explorer运行时返回662行,当我使用hibernate在代码中运行它时返回856行...我尝试使用一个集合并删除重复的方式但显然存在不是重复......

查询:

String queryString = "FROM AEntity AS A " +
                     "LEFT JOIN A.bEntityAS B " +
                     "WHERE A.INIT||A.NUM IN (:carList) AND A.INIT IN (:initList) AND A.NUM IN (:numberList) " + 
                     "AND B.TRUK_AXL_CNT > 0";

public class BEntity implements Serializable{

    @Id
    @Column(name = "NUM")
    private String num;

    @Id
    @Column(name = "INIT")
    private String init;

    @Column(name = "V_CNT")
    private Integer vcnt;
}

public class AEntity implements Serializable{

    @Id
    @Column(name = "NUM")
    private String num;

    @Id
    @Column(name = "INIT")
    private String init;

    @OneToOne
    @PrimaryKeyJoinColumns({
        @PrimaryKeyJoinColumn(name="NUM", referencedColumnName="NUM"),
        @PrimaryKeyJoinColumn(name="INIT", referencedColumnName="INIT")
    })
    private BEntity bEntity;
}

3 个答案:

答案 0 :(得分:0)

如果您可以使用Criteria,请尝试以下内容:

criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)

否则,请尝试在HQL中使用DISTINCT关键字。

select distinct a from AEntity a...

问题在this文章的顶部稍作解释。

答案 1 :(得分:0)

WHERE A.INIT||A.NUM IN (:carList)

没有做你期望的事情。

如果您有一个

的实体
INIT = 1, NUM = 34

的另一个实体
INIT = 13, NUM = 4

然后在两种情况下,表达式A.INIT||A.NUM的计算结果为134,如果仅查找具有INIT = 1, NUM = 34的实体,则您的选择仍会获取两个实体。

要使其正常工作,您必须使用不会出现在任何可能的INIT或NUM值中的分隔符。让我们在这个例子中使用'+'作为分隔符,然后将你的选择改为

WHERE A.INIT || '+' || A.NUM IN (:carList)

并且必须使用相同的分隔符来准备carlist中的值。

答案 2 :(得分:0)

不幸的是,没有其他答案有效 - 但是确定无论出于何种原因,当sql explorer返回错误的结果时,hibernate返回了正确的结果。结果集中的所有两个字符首字母都被sql explorer消除了......给出了错误的结果。

Hibernate是正确的!