Listar as tabelas envolvidas no relacionamento muitos-para-muitos

Tenho um relaciomanto muitos-para-muitos onde eu tenho duas tabelas Polo e Empresa e faço um join table onde eu criei uma tabela com a chave da duas tabelas envolvidas.Criei a classe PoloEmpresa e PoloEmpresaPK, eu queri fazer um list ou um sql que retorne oa campos para eu jogar em mum <p:dataTable>. O comando sql est legal ele me retorna mas eu não consigo apontar o resulta para as classes para pode listar no datatable.

Veja o sql
StringBuffer sql = new StringBuffer();
sql.append(“select p.,e. from polo p join polo_empresa pe “);
sql.append(” on(p.id_polo = pe.id_polo) join “);
sql.append(” empresa e on(e.id_empresa = pe.id_empresa)”);
SQLQuery query = this.session.createSQLQuery(sql.toString());
query.addEntity(“e”,Empresa.class);
query.addEntity(“p”,Polo.class);
return query.list();


classe PK

@Embeddable
public class PoloEmpresaPK implements Serializable{

private static final long serialVersionUID = 2145230426707580106L;

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name="id_polo")
private Polo polo;

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "id_empresa")
private Empresa empresa;

public Polo getPolo() {
	return polo;
}

public void setPolo(Polo polo) {
	this.polo = polo;
}

public Empresa getEmpresa() {
	return empresa;
}

public void setEmpresa(Empresa empresa) {
	this.empresa = empresa;
}

@Override
public int hashCode() {
	final int prime = 31;
	int result = 1;
	result = prime * result + ((empresa == null) ? 0 : empresa.hashCode());
	result = prime * result + ((polo == null) ? 0 : polo.hashCode());
	return result;
}

@Override
public boolean equals(Object obj) {
	if (this == obj)
		return true;
	if (obj == null)
		return false;
	if (getClass() != obj.getClass())
		return false;
	PoloEmpresaPK other = (PoloEmpresaPK) obj;
	if (empresa == null) {
		if (other.empresa != null)
			return false;
	} else if (!empresa.equals(other.empresa))
		return false;
	if (polo == null) {
		if (other.polo != null)
			return false;
	} else if (!polo.equals(other.polo))
		return false;
	return true;
}

Classe polo empresa

@Entity
@Table(name=“polo_empresa”)
public class PoloEmpresa implements Serializable {
/**
*
*/
private static final long serialVersionUID = 6176645767173588871L;
@EmbeddedId
private PoloEmpresaPK chaveComposta;
public PoloEmpresaPK getChaveComposta() {
return chaveComposta;
}
public void setChaveComposta(PoloEmpresaPK chaveComposta) {
this.chaveComposta = chaveComposta;
}


classe polo

@Entity
@Table(name=“polo”)
@SequenceGenerator(name=“seq_polo”,sequenceName=“seq_polo”)
public class Polo implements Serializable{

private static final long serialVersionUID = -6638112313261035555L;

@Id	
@GeneratedValue(generator="seq_polo",strategy=GenerationType.AUTO)
@Column(name="id_polo")
private Integer codigoPolo;	

@Column(name="nome",length=40)
private String nome ;	


@ManyToMany(fetch=FetchType.LAZY)	
@JoinTable(name="polo_empresa",joinColumns={@JoinColumn(name="id_polo")},
		inverseJoinColumns={@JoinColumn(name="id_empresa")})
@Cascade(CascadeType.SAVE_UPDATE)		
@org.hibernate.annotations.ForeignKey(name = "fk_polo_empresa")	
//private Set<Empresa> empresa = new HashSet<Empresa>();
private Collection<Empresa> empresaList;

classe empresa

@Entity
@Table(name=“empresa”)
@SequenceGenerator(name=“seq_empresa”,sequenceName=“seq_empresa”)
public class Empresa implements Serializable{

private static final long serialVersionUID = 498803724556690440L;

@Id
@GeneratedValue(generator="seq_empresa",strategy= GenerationType.AUTO)
@Column(name="id_empresa")
private Integer codigoEmpresa;

@Column(name="nome",length=40)
private String nome ;

@Column(name="nome_fan",length=20)
private String nomeFantasia ;