0

我的查询在使用 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;
}
4

3 回答 3

0

如果可以使用Criteria,请尝试以下操作:

criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)

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

select distinct a from AEntity a...

该问题在本文顶部进行了一些解释。

于 2012-05-30T14:48:12.577 回答
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 中的值必须使用相同的分隔符准备。

于 2012-05-30T15:13:09.610 回答
0

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

休眠是正确的!

于 2012-05-31T15:44:37.120 回答