Dúvida com consulta

Tenho as seguintes tabelas:

CREATE TABLE student ( student_id INTEGER PRIMARY KEY auto_increment, name VARCHAR(250), dado VARCHAR(100), house INTEGER );

CREATE TABLE house ( house BIGINT PRIMARY KEY auto_increment, name VARCHAR(250) UNIQUE NOT NULL );

Com este HQL eu obtenho os dados das tabelas nesta ordem:

[code]Query select = sessao.createQuery("FROM House");

        List todos = select.list();

        System.out.println("Objeto: " + todos.get(0).toString());

        for(int i = 0; i < todos.size(); i++){
            House house = (House) todos.get(i);
            System.out.println("Houses: " + house.getId() + " " + house.getName());

            for(Student s : house.getStudents())
                System.out.println("Students: " + s.getId() + " " + s.getName());
        }

Houses: 15 lar
Students: 11 joao
[/code]

Como eu poderia fazer uma consulta com o seguinte parametro:
select s.name, h.name from student s, house h where s.id = h.id;

a consulta precisa ser montada de acordo com as suas classes e como vc nao postou as classes estou supondo ok.

SELECT s.name AS studentName, h.name AS houseName
FROM Student s
JOIN s.house h

Entao, mas esse código ai colocando nessa linha dá erro:

Por exemplo, essa sql funciona e me dá o resultado que preciso, porém, quando jogo no createQuery dá o erro:

[code]String sql = “select s.name, s.id, s.house_id, h.id, h.name from student s, house h where s.house_id = h.id”;
Query select = sessao.createQuery(sql);

o erro:
org.hibernate.hql.ast.QuerySyntaxException: student is not mapped [select s.name, s.id, s.house_id, h.id, h.name from student s, house h where s.house_id = h.id]
[/code]

Preciso de um sql semelhante a esse:
select s.name, h.name from student s, house h where s.house_id = h.id;

Essa é minha classe Student:

[code]@Entity
@Table(name=“student”)
public class Student {
@Id
@Column(name=“id”)
@GeneratedValue
private long id;

@Basic
@Column(name=“name”, unique=true)
private String name;

@ManyToOne
@JoinColumn(name=“house_id”)
private House house;[/code]

E a House:

[code]@Entity
@Table(name=“house”)
public class House {
@Id
@Column(name=“id”)
@GeneratedValue
private long id;

@Basic
@Column(name=“name”,unique=true)
private String name;

@OneToMany(mappedBy=“house”)
private Set<Student> students;[/code]

Não sei se é isto que você quer.
Mas o select seria mais ou menos assim;

StringBuilder sql = new StringBuilder();
sql.append("SELECT s.nome, s.id, s.house.nome, ");
sql.append("FROM student s, house h ");
sql.append("WHERE s.id = h.id");

sessao.createQuery(sql.toString());

Veja se lhe ajuda.

[quote=moacirjava]

[code]@Entity
@Table(name=“student”)
public class Student {
@Id
@Column(name=“id”)
@GeneratedValue
private long id;

@Basic
@Column(name=“name”, unique=true)
private String name;

@ManyToOne
@JoinColumn(name=“house_id”)
private House house;[/code]

E a House:

[code]@Entity
@Table(name=“house”)
public class House {
@Id
@Column(name=“id”)
@GeneratedValue
private long id;

@Basic
@Column(name=“name”,unique=true)
private String name;

@OneToMany(mappedBy=“house”)
private Set<Student> students;[/code][/quote]

Cara teu mapeamento ta correto? Voce não teria, em Student @OneToMany e em House @ManyToOne ?

Meu mapeamento está correto. Se você do jeito que vc diz, seria como se estivesse dizendo “que um Student pode ter várias Houses e uma várias Houses podem ter só um Student”

Eu estava me referindo as anotações sobre os atritudos. Estão corretas?

[quote=joaorafael]Não sei se é isto que você quer.
Mas o select seria mais ou menos assim;

StringBuilder sql = new StringBuilder();
sql.append("SELECT s.nome, s.id, s.house.nome, ");
sql.append("FROM student s, house h ");
sql.append("WHERE s.id = h.id");

sessao.createQuery(sql.toString());

Veja se lhe ajuda.[/quote]

//Com essa instrucao nao funcionou...
StringBuilder consulta = new StringBuilder();
consulta.append("SELECT s.name, s.id, s.house_id FROM student s, house h WHERE s.house_id = h.id");

//Com essa funcionou, o mapemento tah certo.
Query select = sessao.createQuery("SELECT h FROM House h");

Oh, meu desculpe… entendi errado, mas em relação a anotação, também está correta.

@ManyToOne // Não seria @OneToMany @JoinColumn(name="house_id") private House house;

E em uma Coleção @ManyToOne ?

Era só a ordem que me referia!

Na documentação do hibernate mais precisamente antes do item 11.7 tem um exemplo exatamente do que preciso. Mas não funcionou aqui…

The interface INamed might be implemented by various persistent classes:

from Eg.Named n, Eg.Named m where n.Name = m.Name

Usando esse sql:

dá esse erro:

Mas tentando fazer um FROM Student, me retorna todos os houses e todos os students.

A questão é que la ele não utilzava uma coleção!
Pra coleções utiilza-se ou IN ou JOIN pra poder “entrar” nas coleções e assim selecionar por um campo!

Neste seu caso,não seria mais facil fazer o select na tablea House já que vc mantem uma refencia bi-direcional com a tabela Student?

[quote=71C4700]A questão é que la ele não utilzava uma coleção!
Pra coleções utiilza-se ou IN ou JOIN pra poder “entrar” nas coleções e assim selecionar por um campo!

Neste seu caso,não seria mais facil fazer o select na tablea House já que vc mantem uma refencia bi-direcional com a tabela Student?
[/quote]

Sim seria. Então pra saber se determinado Student existe em determinada House eu teria de buscar somente o número da House?

Então tenta fazer assim:

// Aqui voce seleciona o Student com o id que vc passará como parametro
Query select = sessao.createQuery("SELECT s.students FROM House h, IN (h.students) s where s.id:=id");  

//Seta este parametro
select.setParameter("id",12);

A questão não seria a utilização deste IN ou INNER JOIN pra consultar valores de coleções ?
Neste caso a cima vc teria com resultado uma lista de Studens, já que na House tem N Students. A grande coisa seria que vc taria passando o id do Student.
Não fiz o teste mas acredito que este codigo funcione :

71C4700, tenho que te pagar uma cerveja :thumbup: !!!

Deu certo, tá ai o código que funciona, mas eu comentei todas as linhas só por teste.
Basta descomentar cada trecho que funciona todas as consultas.

Tive muita dúvida em relação aos dados, mas depois de muito tempo percebi o quanto é vantajoso o hibernate, ele busca todos os outros dados basta ter um objeto recebendo e pronto.

Achei bem legal.

[code]try{
Session sessao = StartHibernate.getSession();
Transaction transaction = sessao.beginTransaction();

// Query select = sessao.createQuery("FROM House h WHERE h.name = :nome");
// select.setParameter("nome", "a");
//
// List todos = select.list();
//
// for(int i = 0; i < todos.size(); i++){
// House house = (House) todos.get(i);
// System.out.println("Houses: " + house.getId() + " " + house.getName());
// }
/*****************************************************************************************/
// Query select = sessao.createQuery("FROM House");
// List todos = select.list();
//
// for(int i = 0; i < todos.size(); i++){
// House house = (House) todos.get(i);
// System.out.println("Houses: " + house.getId() + " " + house.getName());

// for(Student s : house.getStudents())
// System.out.println("Students: " + s.getId() + " " + s.getName());
// }
/****************************************************************************************/
// Query select = sessao.createQuery("FROM Student s WHERE s.id = :id");
// long l = 1;
// select.setParameter("id", l);
//
// List todos = select.list();
//
// for(int i = 0; i < todos.size(); i++){
// Student st = (Student) todos.get(i);
// House h = st.getHouse();
// System.out.println("Students: " + st.getId() + " " + st.getName() + "\n" +
// "House: " + h.getName());
//
// }
transaction.commit();
sessao.close();

// return todos;
}
catch(Exception e){
System.out.println("Erro no metodo pesquisa - Classe OperacoesBanco.");
e.printStackTrace();
return null;
}[/code]

Estamos todos aprendendo! Fico feliz por ajudar!!!

Sem contar que vc poderia utilizar JPA pra esta parte do ORM que vc ta fazendo com Hibernate. Ela já possui uma forma de contre sobre as transações, não um controle transacional,mas permite vc integra-lo com algum framework de IoC para controlar isso. Desta forma fica muito flexivel. Eu Estudei e gostei bastante!

Mas espero a cerveja !!! . EHehEHEheEHHEE :lol: