我的查询在使用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;
}
答案 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是正确的!