JPA (Dados estão vindo misturados)

Ola a todos.
Estou com um problema aqui com o JPA e não tenho nem ideia de como resolve-lo.
É o seguinte, na minha aplicação eu tenho um contrato, e este contrato possui varios extratos.
Estou fazendo assim : dentro do meu bean de extrato eu coloco um contrato e faço o relacionamento de ManyToOne la.
E dentro do contrato eu coloco um relacionamento de OneToMany.

Mas ae na hora da busca,olhem só o que acontece:
Se um cliente tem varios contratos,(vamos supor 2 contratos) os dados do 1° contrato estão indo para o segundo.
Por Exemplo:
Se o contrato 1 tem 3 extratos sendo eles 1,2,3.
e o contrato 2 tem 6 extratos sendo eles 4,5,6,7,8,9.

Na hora que eu faço a busca no banco, o resultado é o seguinte:
contrato 1 traz os valores 1,2,3.
e o contrato 2 traz os valores 1,2,3,7,8,9.

Não tenho nem ideia do pq disso.
Alguém pode me ajudar ??

Aqui está o código.

Bean Contrato.


@Entity
@Table(name="kg_contrato")
public class KgContrato {
	
	@Column(name="carteira")
	private String carteira;
	
	@Id
	@Column(name="bordero")
	private int bordero;
	
	@Column(name="totalitens")
	private String totalItens;
	
	@Temporal(TemporalType.TIMESTAMP)
	@Column(name="dataaquisicao",nullable = false)
	private Date dataAquisicao ;
	
	@Column(name="cedente")
	private int cedente;
	
	@Column(name="valorbordero")
	private String valorBordero;
	
	@Temporal(TemporalType.TIMESTAMP)
	@Column(name="dataatualizacao",nullable=false)
	private Date dataAtualizacao ;

	
               @OneToMany(mappedBy="contrato", cascade=CascadeType.ALL, fetch=FetchType.LAZY)
	private List<KgExtrato> kgextratos = new ArrayList<KgExtrato>();

                // gets and sets
               // hashcode equals
 }

Bean Extrato

@Entity
@Table(name="kg_extrato")
public class KgExtrato {
	
	@EmbeddedId
	private ChaveKgExtrato chaveCompostaKgExtrato ;
	
	@Column(name="bordero")
	private int bordero;
	
	@Column(name="cedente")
	private int cedente;
	
	@Temporal(TemporalType.TIMESTAMP)
               @Column(name="dataaquisicao", nullable = false)
	private Date dataAquisicao ;
		
	@Column(name="inscricaosacado")
	private String inscricaoSacado;
	
	@Column(name="nomesacado")
	private String nomeSacado;
	
	@Temporal(TemporalType.TIMESTAMP)
                @Column(name="datavencimento", nullable = false)
	private Date dataVencimento;
	
	@Column(name="numerotitulo")
	private String numeroTitulo;
	
	@Column(name="valortitulo")
	private String valorTitulo;
	
	@Column(name="carteiraboleto")
	private String carteiraBoleto;
	
	@Column(name="grupotipocarteira")
	private int grupoTipoCarteira;
	
	@ManyToOne(fetch=FetchType.LAZY,targetEntity=KgContrato.class)
	@JoinColumn( name="bordero", referencedColumnName="bordero", insertable=false, updatable=false)
	private KgContrato contrato;

                // gets and sets
                // hash code e equals
}

Metodo de busca no banco.


public List<KgExtrato> carregaExtratosPorBordero (int codigoBordero,Date date,Date date2, String codigoProduto){
		
//		EntityManager em = emf.createEntityManager();
		
		StringBuffer  sb = new StringBuffer();
		
		List<KgExtrato> resposta = new ArrayList<KgExtrato>();
		
		if(codigoProduto.equals("")){
			sb.append("select distinct kgextrato from KgExtrato kgextrato");
			sb.append(" where kgextrato.bordero = '" + codigoBordero + "'");
			sb.append(" and kgextrato.dataAquisicao between '"+ DATAUTILS.getAno(date) + "/" + DATAUTILS.getMes(date) + "/" + DATAUTILS.getDia(date) +"' and " + "'"+ DATAUTILS.getAno(date2) + "/" + DATAUTILS.getMes(date2)  + "/" + DATAUTILS.getDia(date2)+"'");
			sb.append(" order by kgextrato.chaveCompostaKgExtrato.borderoItem");
		}else{
			sb.append("select distinct kgextrato from KgExtrato kgextrato");
			sb.append(" where kgextrato.bordero = '" + codigoBordero + "'");
			sb.append(" and kgextrato.dataAquisicao between '"+ DATAUTILS.getAno(date) + "/" + DATAUTILS.getMes(date) + "/" +                     DATAUTILS.getDia(date) +"' and " + "'"+ DATAUTILS.getAno(date2) + "/" + DATAUTILS.getMes(date2)  + "/" + DATAUTILS.getDia(date2)+"'");
			sb.append(" and kgextrato.produtoTitulo = '" +codigoProduto+ "'");
			sb.append(" order by kgextrato.chaveCompostaKgExtrato.borderoItem");
		}
		
		/*
		SELECT * FROM kg_extrato WHERE kg_extrato.bordero = '57138'
			and kg_extrato.dataaquisicao BETWEEN '2008/10/15' and '2008/10/15'
		*/
	
		Query query = OperacoesPersistencia.currentEntityManager().createQuery(sb.toString());
		
		try {
			resposta = (List<KgExtrato>)query.getResultList();
			} catch (Exception e) {
			resposta = null;
			  }
			return resposta;
		}

É isso ae pessoal.
Quem puder me ajudar, ficarei grato.
Obrigado.

provavelmente é um erro na seu comando sql, deve ter algum relacionamento que você não colocou nas condições, ou mal formação do comando sql

se você fizer esta mesma consulta no direto no banco ela retorna os valores certos?

Pior q se eu fizer essa mesma consulta direto no banco de dados, ela retorna os dados certos.

tente passar essa sql SELECT k FROM KgExtrato k e veja e ele traz os dados corretos

Entao …
se eu passo essa sql aqui no java pelo JPA, ela traz os resultados embaralhados.
E quando eu faço a mesma sql no banco de dados direto, traz os dados certos.