powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate + Swing
16 сообщений из 16, страница 1 из 1
Hibernate + Swing
    #38228380
Валисий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!
Пишу приложение для работы с MySQL БД. Пишу на Java, использую Hibernate. Возникла проблема: рассматривается фрагмент БД MySQL: имеются таблицы Adress, Firma, Supplier. Не спрашивайте, почему так: партия сказала надо... Атрибуты таблицы Adress: int ID, varchar City, varchar Street, int NumOfHouse. Атрибуты Firma: int Firma_ID, String Name, String Phone, int Adr_ID (это внешний ключ, связь с таблицей Adress). Атрибуты Supplier: int Post_ID, int Firm_ID (внешний ключ, связь с Firma), double Quality, double Price_Qual.
Все связи типа один к одному. Сей фрагмент должен отображаться в приложении так: чтобы в моем приложении создавалось окошко, где будет табличка Suppliers, где будут столбцы Name, Phone, City, Street, NoH, Qual, Price_Qual, то есть, список записей, аналогичный SQL-запросу:
Код: sql
1.
select Firma.Name, Firma.Phone, Adress.City, Adress.Street, Adress.NumOfHouse, Supplier.Quality, Supplier.Price_Qual from Supplier s, Firm f, Adress a where (s.Firms_ID = f.Firma_ID) AND (f.Adr_ID = a.Adress_ID)


У меня есть классы Supplier, Firm, FirmMetods, Adress, AdressMetods, и к классу Supplier есть SupplierMetods, SupplierTableModel, SupplierFrame. Привожу только 3 класса: классы FirmMetods, AdressMetods аналогичны SupplierMetods.

package tovar.entity;

import java.util.HashSet;
import java.util.Set;

public class Supplier {
private Long PostID;
private Firm Sfirm;
private int Sfirmtype;
private double SQual;
private double SPrice_Qual;

private Set<Tovar> tovarList = new HashSet<Tovar>();

public Long getPostID() {
return PostID;
}

public void setPostID(Long postID) {
PostID = postID;
}

public Firm getSfirm() {
return Sfirm;
}

public void setSfirm(Firm sfirm) {
Sfirm = sfirm;
}

public int getSfirmtype() {
return Sfirmtype;
}

public void setSfirmtype(int sfirmtype) {
Sfirmtype = sfirmtype;
}

public double getSQual() {
return SQual;
}

public void setSQual(double sQual) {
SQual = sQual;
}

public double getSPrice_Qual() {
return SPrice_Qual;
}

public void setSPrice_Qual(double sPrice_Qual) {
SPrice_Qual = sPrice_Qual;
}

public Set<Tovar> getTovarList() {
return tovarList;
}

public void setTovarList(Set<Tovar> tovarList) {
this.tovarList = tovarList;
}



}

package tovar.entity;

import java.util.List;

import org.hibernate.Session;

import shop.utils.HibernateUtil;

public class SupplierMetods {

public void addSupplier(Adress adress, Firm firm, int firmtype, double qual, double pqual) { //добавление нового товара
Session session = HibernateUtil.configureSessionFactory().getCurrentSession();
session.beginTransaction();
Supplier r= new Supplier();
r.setSfirm(firm);
r.setSfirmtype(firmtype);
r.setSQual(qual);
r.setSPrice_Qual(pqual);
session.save(r);
session.getTransaction().commit();
}

public void updateSupplier(Object o) {

Session session = HibernateUtil.configureSessionFactory().getCurrentSession();
session.beginTransaction();
session.update(o);
System.out.println("Updated");
session.flush();
session.getTransaction().commit();
}

public List<Supplier> listSupplier() {
Session session = HibernateUtil.configureSessionFactory().getCurrentSession();
session.beginTransaction();
List<Supplier> result = session.createQuery(" select Firma.Name, Firma.Phone, Adress.City, Adress.Street, " +
"Adress.NumOfHouse, Supplier.Quality, Supplier.Price_Qual from Supplier s, Firm f, Adress a " +
"where (s.Firms_ID = f.Firma_ID) AND (f.Adr_ID = a.Adress_ID)").list();
session.getTransaction().commit();
return result;
}


}



package tovar.entity;

import java.util.List;

import javax.swing.table.AbstractTableModel;

public class supplierTableModel extends AbstractTableModel{

private String[] columnsNames = {"Name","Phone","City", "Street", "NumOfHouse", "Quality", "Price_Quality"};
private List<Supplier> data;
public supplierTableModel(List<Supplier> suppList) {
super();
data = suppList;
}

@Override
public int getRowCount() {
// TODO Auto-generated method stub
synchronized (data) {
return data.size();
}
}

@Override
public int getColumnCount() {
// TODO Auto-generated method stub
return 7;
}

@Override
public String getColumnName(int column) { return columnsNames[column];}

@Override
public Object getValueAt(int row, int col){
switch(col){
case 0: return data.get(row).getSfirm().getFName();
case 1: return data.get(row).getSfirm().getFPhone();
case 2: return data.get(row).getSfirm().getAdress().getAdrCity();
case 3: return data.get(row).getSfirm().getAdress().getAdrStreet();
case 4: return data.get(row).getSfirm().getAdress().getAdrNoH();
case 5: return data.get(row).getSQual();
case 6: return data.get(row).getSPrice_Qual();
default: return data.get(row).getPostID();
}
}

@Override
public void setValueAt(Object value, int row, int col){
Supplier r = data.get(row);
SupplierMetods t = new SupplierMetods();
switch(col){
case 0: r.getSfirm().setFName(value.toString());
t.updateSupplier(r);
fireTableCellUpdated(row,col);
break;
case 1: r.getSfirm().setFPhone(value.toString());
t.updateSupplier(r);
fireTableCellUpdated(row,col);
break;
case 2: r.getSfirm().getAdress().setAdrCity(value.toString());
t.updateSupplier(r);
fireTableCellUpdated(row,col);
break;
case 3: r.getSfirm().getAdress().setAdrStreet(value.toString());
t.updateSupplier(r);
fireTableCellUpdated(row,col);
break;
case 4: r.getSfirm().getAdress().setAdrNoH(Integer.parseInt(value.toString()));
t.updateSupplier(r);
fireTableCellUpdated(row,col);
break;
case 5: r.setSQual(Double.parseDouble(value.toString()));
t.updateSupplier(r);
fireTableCellUpdated(row,col);
break;
case 6: r.setSPrice_Qual(Double.parseDouble(value.toString()));
t.updateSupplier(r);
fireTableCellUpdated(row,col);
break;
}
}

}


Еще на всякий случай приведу список полей классов Adress, Firm:
private Long AdrID;
private String AdrCity;
private String AdrStreet;
private int AdrNoH; //Number of house

private Long FirmID;
private String FName;
private String FPhone;
private Adress adress;

Вот так. Аннатоциями не пользуюсь, задача в написании именно с маппинг-файлами.
Плз, кто может, помогите, как мне сделать так, чтобы выборка делалась нормально, и таблица в приложении тоже заполнялась нормально?
...
Рейтинг: 0 / 0
Hibernate + Swing
    #38228680
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Догадайтесь какая возникла проблема" и "прочитайте мой код, который мне даже лень подсветить"
...
Рейтинг: 0 / 0
Hibernate + Swing
    #38230045
Валисий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Критика конструктивная, согласен. Виноват, исправлюсь:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
package tovar.entity;

import java.util.HashSet;
import java.util.Set;


public class Supplier {
	private Long PostID;
    private Firm Sfirm;
    private int Sfirmtype;
    private double SQual;
    private double SPrice_Qual;
    
    private Set<Tovar> tovarList = new HashSet<Tovar>();

	public Long getPostID() {
		return PostID;
	}

	public void setPostID(Long postID) {
		PostID = postID;
	}

	public Firm getSfirm() {
		return Sfirm;
	}

	public void setSfirm(Firm sfirm) {
		Sfirm = sfirm;
	}
	
	public int getSfirmtype() {
		return Sfirmtype;
	}

	public void setSfirmtype(int sfirmtype) {
		Sfirmtype = sfirmtype;
	}

	public double getSQual() {
		return SQual;
	}

	public void setSQual(double sQual) {
		SQual = sQual;
	}

	public double getSPrice_Qual() {
		return SPrice_Qual;
	}

	public void setSPrice_Qual(double sPrice_Qual) {
		SPrice_Qual = sPrice_Qual;
	}

	public Set<Tovar> getTovarList() {
		return tovarList;
	}

	public void setTovarList(Set<Tovar> tovarList) {
		this.tovarList = tovarList;
	}	
}



Класс SupplierMetods:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
package tovar.entity;

import java.util.List;

import org.hibernate.Session;

import shop.utils.HibernateUtil;

public class SupplierMetods {
	
	public void addSupplier(Adress adress, Firm firm, int firmtype, double qual, double pqual) { //добавление нового товара
        Session session = HibernateUtil.configureSessionFactory().getCurrentSession(); 
        session.beginTransaction(); 
        Supplier r= new Supplier();
        r.setSfirm(firm);
        r.setSfirmtype(firmtype);
        r.setSQual(qual);
        r.setSPrice_Qual(pqual);
        session.save(r);
        session.getTransaction().commit();
    }
	
    public void updateSupplier(Object o) { //обновление товара
        
        Session session = HibernateUtil.configureSessionFactory().getCurrentSession();
        session.beginTransaction();
        session.update(o);        
        System.out.println("Updated");
        session.flush();
        session.getTransaction().commit();        
    }
    
    public List<Supplier> listSupplier() { //выборка из таблицы товаров
        Session session = HibernateUtil.configureSessionFactory().getCurrentSession();
        session.beginTransaction();
        List<Supplier> result = session.createSQLQuery(" select Firma.Name, Firma.Phone, Adress.City, Adress.Street, " +
        		"Adress.NumOfHouse, Supplier.Quality, Supplier.Price_Qual from Supplier s, Firm f, Adress a " +
        		"where (s.Firms_ID = f.Firma_ID) AND (f.Adr_ID = a.Adress_ID)").list();
        session.getTransaction().commit();
        return result;
    }

}



Класс SupplierTableModel:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
package tovar.entity;

import java.util.List;

import javax.swing.table.AbstractTableModel;

public class supplierTableModel extends AbstractTableModel{
	
	private String[] columnsNames = {"Name","Phone","City", "Street", "NumOfHouse", "Quality", "Price_Quality"};
	private List<Supplier> data;
	public supplierTableModel(List<Supplier> suppList) {
		super();
		data = suppList;
	}

	@Override
	public int getRowCount() {
		// TODO Auto-generated method stub
		synchronized (data) {
		return data.size();
		}
	}

	@Override
	public int getColumnCount() {
		// TODO Auto-generated method stub
		return 7;
	}

	@Override
	public String getColumnName(int column) { return columnsNames[column];}
	
	@Override
	public Object getValueAt(int row, int col){
		switch(col){
		case 0: return data.get(row).getSfirm().getFName();
		case 1: return data.get(row).getSfirm().getFPhone();
		case 2: return data.get(row).getSfirm().getAdress().getAdrCity();
		case 3: return data.get(row).getSfirm().getAdress().getAdrStreet();
		case 4: return data.get(row).getSfirm().getAdress().getAdrNoH();
		case 5: return data.get(row).getSQual();
		case 6: return data.get(row).getSPrice_Qual();
		default: return data.get(row).getPostID();
		}
	}
	
	@Override
	public void setValueAt(Object value, int row, int col){
		Supplier r = data.get(row);
		SupplierMetods t = new SupplierMetods();
		switch(col){
		case 0: r.getSfirm().setFName(value.toString());
				t.updateSupplier(r);
				fireTableCellUpdated(row,col);
				break;
		case 1: r.getSfirm().setFPhone(value.toString());
				t.updateSupplier(r);
				fireTableCellUpdated(row,col);
				break;
		case 2: r.getSfirm().getAdress().setAdrCity(value.toString());
				t.updateSupplier(r);
				fireTableCellUpdated(row,col);
				break;
		case 3: r.getSfirm().getAdress().setAdrStreet(value.toString());
				t.updateSupplier(r);
				fireTableCellUpdated(row,col);
				break;
		case 4: r.getSfirm().getAdress().setAdrNoH(Integer.parseInt(value.toString()));
				t.updateSupplier(r);
				fireTableCellUpdated(row,col);
				break;
		case 5: r.setSQual(Double.parseDouble(value.toString()));
				t.updateSupplier(r);
				fireTableCellUpdated(row,col);
				break;
		case 6: r.setSPrice_Qual(Double.parseDouble(value.toString()));
				t.updateSupplier(r);
				fireTableCellUpdated(row,col);
				break;
		}
	} 

}



Вот так. Что хочу сказать: в классе SupplierMetods запрос работает корректно как в базе, так и в Java. Но возникает ошибка:
Код: java
1.
cannot be cast to tovar.entity.Supplier

, и указывает на строку
Код: java
1.
case 0: return data.get(row).getSfirm().getFName();

в классе SupplierTableModel, и на много чего еще, но не мои классы. В чем ошибка, как ее преодолеть? Я так понимаю, проблема в том, что в классе Supplier нет таких полей, которые я хочу увидеть в результате выборки. Посоветуйте пожалуйста, как мне классы организовать, что все работало. Я подумал было сделать в классе Supplier поля FirmName, FirmPhone, City, Street, NumOfHouse в дополнение к существующим, и подогнать под результат запроса из базы, но тогда непонятно, за фигом нужны все связи и вообще Hibernate. Должен же быть другой путь, который я не могу найти. Кто может, посоветуйте плз, или дайте ссылку на литературу. Всем заранее спасибо.
П.С. за свой предыдущий корявый пост очень изиняюсь, забыл про подсветку кода.
...
Рейтинг: 0 / 0
Hibernate + Swing
    #38230054
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Теперь понятно. Запрос в таком виде никак вам не вернет список Supplier. Он вам возвращает List<Object[]> на самом деле.
Чтобы найти решение, достаточно открыть мануал
http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querysql.html
И прочитать пару разделов.
Код: java
1.
sess.createSQLQuery("SELECT * FROM CATS").addEntity(Cat.class);


Но, вообще, мануал стоит освоить целиком. Запрос можно сделать намного проще, если ассоциации прописать в маппинге.
...
Рейтинг: 0 / 0
Hibernate + Swing
    #38230153
Валисий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое спасибо за ответ. Про то, что не возвращается список типа Supplier, я понял, но вот что сделать, пока не ясно. Я бы радостно подкорректировал списки, убрав типизацию, ну то есть чтобы было не List<Supplier> а просто List, но тогда непонятно, как мне выцепить поля связанных классов, типа названия фирмы и адреса...
...
Рейтинг: 0 / 0
Hibernate + Swing
    #38230155
Валисий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
За ссылку большое спасибо, вполне познавательно. Возник вопрос: там сущности Cat и Dog. У сущности Cat есть атрибут Dog_ID. Вроде бы там сказано, что связаны отношением многие к одному. Вопрос в следующем: если у меня связь один к одному, то есть у одного Supplier один объект Firm, как мне делать связь? Делать так как я, то есть создавать в классе Supplier поле firm типа Firm, или делать поле Firm_ID типа int, то есть так, как сделано в MySQL базе? Сей вопрос меня давно уже интересует. Читал мануалы, оба варианта видел в примерах, но как сделать выборку из нескольких таблиц, не сказано.
...
Рейтинг: 0 / 0
Hibernate + Swing
    #38231707
Валисий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В маппинге у меня прописаны связи:

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="tovar.entity">
    <class name="Adress" table="Adress">
        <id name="AdrID" column="Adress_ID">
            <generator class="native"/>
        </id>
        <property name="AdrCity" column="City"/>
        <property name="AdrStreet" column="Street"/>
        <property name="AdrNoH" column="NumOfHouse"/>
    </class>
</hibernate-mapping>



Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="tovar.entity">
    <class name="Firm" table="Firma">
        <id name="FirmID" column="Firma_ID">
            <generator class="native"/>
        </id>
        <property name="FName" column="Name"/>
        <property name="FPhone" column="Phone"/>
        <one-to-one name="adress" class="tovar.entity.Adress"></one-to-one>
    </class>
</hibernate-mapping>



Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="tovar.entity">
    <class name="Supplier" table="Supplier">
        <id name="PostID" column="Supplier_ID">
            <generator class="native"/>
        </id>
        <one-to-one name="Sfirm" class="tovar.entity.Firm"></one-to-one>
        <many-to-one name="Sfirmtype" class="tovar.entity.FirmTypes">
        	<column name="Firms_Type_ID" not-null="true" /> 
		</many-to-one>
        <property name="SQual" column="Quality"/>
        <property name="SPrice_Qual" column="Price_Qual"/>
        <set name="tovarList" table="POSTUPLENIE">
            <key column="supplier"></key>
            <many-to-many column="tovar" class="tovar.entity.Tovar"/>
        </set>
    </class>
</hibernate-mapping>



Вот такие вот связи. О выборке: я создал новый класс Post с полями String Name, String Phone, String City, String Street, int num, double Qual, double PQual, то есть аналогичны результатам выборки. Изменил запрос:
Код: java
1.
2.
3.
List<Post> result = session.createSQLQuery(" select Firma.Name, Firma.Phone, Adress.City, Adress.Street, " +
"Adress.NumOfHouse, Supplier.Quality, Supplier.Price_Qual from Supplier s, Firm f, Adress a " +
"where (s.Firms_ID = f.Firma_ID) AND (f.Adr_ID = a.Adress_ID)").list();


Изменил класс SupplierTableModel: в конструктор передаю List<Post>. И получаю ту же самую ошибку: cannot be cast to tovar.entity.Post
В чем тут проблема, вообще не понимаю... Вроде бы уже и результат запроса в класс попадает как положено, а туда же, толку никакого.
...
Рейтинг: 0 / 0
Hibernate + Swing
    #38231778
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валисий,
Вы ничего не поменяли в запросе. Хиберней никак не может угадать что вы хотите List<Post>. Он вам возвращает List<Object[]>, потому что вы пишете SQL запросы, а не HQL и потому что вы не сообщаете какой объект хотите получить на выходе.
Используйте HQL
select from Post where...
Используйте хотя бы Criteria API.
Примеры обильно приведены в мануале. Почему вы продолжаете настойчиво использовать SQL?
...
Рейтинг: 0 / 0
Hibernate + Swing
    #38231807
Валисий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SQL использую потому что он взаимодействует непосредственно с базой, а не с классами Java, и честно говоря, в SQL ориентируюсь лучше, чем в HQL. Просто не понимаю, откуда HQL возьмет данные для выборки.
За совет спасибо, буду пробовать.
...
Рейтинг: 0 / 0
Hibernate + Swing
    #38232145
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВалисийПросто не понимаю, откуда HQL возьмет данные для выборки.
а вы доку читали по хиберу полностью?
...
Рейтинг: 0 / 0
Hibernate + Swing
    #38234475
Валисий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доку по хиберу читал естественно не полностью.
Использую Criteria. Имею следующее:
Код: java
1.
List<Supplier> result = (List<Supplier>) session.createCriteria("tovar.entity.Supplier").list();


Выборка работает, но некорректно. Как я уже упоминал, у меня таблички связаны внешним ключрм. Результат выборки в SQL примерно такой:
Код: sql
1.
select Supplier.ID Supplier.Quality, Supplier.Price_Qual, Firma.Firma_ID, Firma,Name, Firma.Phone, Adress.City, Adress.Street, Adress.NoH from Supplier left outer join Firma on Supplier.Post_ID=Firma.Firma_ID left outer join Adress on Firma.Adr_ID=Adress.Adress_ID;


я подумал, что мне нужен inner join по столбцам Supplier.Firms_ID=Firma.Firma_ID, Firma.Adr_ID=Adress.Adress_ID.
Как мне добиться такого эффекта? Пытался поставить sqlRestriction:
Код: java
1.
2.
List<Supplier> result = (List<Supplier>) session.createCriteria("tovar.entity.Supplier").
add(Restrictions.sqlRestriction((Firms_ID=Firma_ID) and (Adr_ID=Adress_ID)).list();


Результатом выборки стала первая строкка таблицы Supplier, причем связанная с таблицей Firm неправильно. Как их правильно связать?
...
Рейтинг: 0 / 0
Hibernate + Swing
    #38234498
IDVsbruck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Говорили, балакали, сіли та й заплакали ..."

Да не надо их ручками связывать, ты уже по идее все в POJO связал, теперь просто выбирай требуемое.
Так как не вижу твоих POJO, то затрудняюсь корректно отобразить, тем более, что нарушены общепринятые правила именования полей (индексное - id, все с маленькой буквы) ... не суть важно, но запутаться можно на раз-два.

Если делать
Код: java
1.
session.createSQLQuery("SELECT s.sfirm.Name, s.sfirm.Phone, s.sfirm.adr.City, s.sfirm.adr.Street, s.sfirm.adr.NumOfHouse, s.Quality, s.Price_Qual FROM Supplier s").list()

то вернет Object[7] (как уже не раз выше было сказано). И хотя не очень понятно, зачем делать промежуточный объект с этим набором полей, когда они все EAGER, но тем не менее, если хочется получить на выходе все-таки List<Post>, то можно создать объект в HQL-запросе:
Код: java
1.
session.createSQLQuery("SELECT NEW Post(s.sfirm.Name, s.sfirm.Phone, s.sfirm.adr.City, s.sfirm.adr.Street, s.sfirm.adr.NumOfHouse, s.Quality, s.Price_Qual) FROM Supplier s").list()

Естественно, в объекте Post необходимо создать конструктор с такими полями.
Важнее, чтобы ты увидел, как связываются поля объектов в запросе (не поля таблиц! а поля объектов, так как HQL оперирует не таблицами, а сущностями).
...
Рейтинг: 0 / 0
Hibernate + Swing
    #38234993
kastolom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Валисий,

наслаждайся
...
Рейтинг: 0 / 0
Hibernate + Swing
    #38235783
Валисий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за ответы, особенно за ссылку, очень полезная, только очень уж длинные лекции...
А все таки, можно ли такой запрос с помощью Criteria сделать? Я, как уже писал выше, сделал запрос, но он таблицы связывает совершенно не так, как надо мне. Вот как бы мне их связать? Или надо в маппинге прописать что то новое? Ну то есть:
<one-to-one name="adress" class="tovar.entity.Adress"></one-to-one>
В етом теге указать что нибудь типа key column, или как то так, чтобы хиберу было понятно, какой конкретно столбец есть внешний ключ и куда он ссылается. Или пойти другим путем: сделать в Criteria указание, как именно делать join и по каким столбцам. Пробовал написать HQL:
session.createQuery("from Supplier").list();
Получил то же самое что и используя Criteria без ограничений, то есть выборку с left outer join по столбцам ID во всех таблицах, то есть таблицы Supplier, Firma были связаны как left outer join Firma on Supplier_ID = Firma_ID, что естественно меня не устраивает. Добавил Criteria с параметром JoinType, но толку чуть, потому как до сих пор не могу понять, где и как мне указать, по каким столбцам выполнять join.

IDVsbruck ,
По поводу класса Post: я пришел к выводу, что он мне и не нужен вовсе, я его удалил. А по поводу SQL запроса: все бы хорошо, вот только он мне вернет опять таки именно List<Object> а мне нужен List<Supplier>, потому как в POJO и других классах у меня все методы исключительно для работы с объектами класса Supplier. По поводу отсутствия POJO: в первых постах я выложил классы. Я не уверен, но они вроде и есть POJO.
...
Рейтинг: 0 / 0
Hibernate + Swing
    #38235784
Валисий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Виноват, опять забыл подсветку кода:

Код: xml
1.
<one-to-one name="adress" class="tovar.entity.Adress"></one-to-one>



В етом теге указать что нибудь типа key column, или как то так, чтобы хиберу было понятно, какой конкретно столбец есть внешний ключ и куда он ссылается. Или пойти другим путем: сделать в Criteria указание, как именно делать join и по каким столбцам. Пробовал написать HQL:
Код: java
1.
session.createQuery("from Supplier").list();


Получил то же самое что и используя Criteria без ограничений, то есть выборку с left outer join по столбцам ID во всех таблицах, то есть таблицы Supplier, Firma были связаны как left outer join Firma on Supplier_ID = Firma_ID, что естественно меня не устраивает. Добавил Criteria с параметром JoinType, но толку чуть, потому как до сих пор не могу понять, где и как мне указать, по каким столбцам выполнять join.
...
Рейтинг: 0 / 0
Hibernate + Swing
    #38235824
Валисий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Товарищи, удивительное рядом... Я то, наивный, используя связь one to one наивно считал что все хорошо, все как в базе, ан нет: при использовании такой связи таблицы можно связать только по первичным ключам, то есть у связанных записей должны быть одинаковые ID. Но можно указать в теге one to one следующее: constrained="true". И не нужно забывать про lazy. Правда, я так не сделал, я сделал так:
Код: xml
1.
<many-to-one name="Sfirm" column="Firms_ID" class="tovar.entity.Firm" unique="true" lazy="false"></many-to-one>


Sfirm есть поле класса Supplier, подразумевается фирма, которая является Supplier'ом.
Firms_ID ето столбец в БД, внешний ключ таблицы Supplier, ссылающийся на таблицу Firm.
unique - вот ето как раз и есть то, чего я добивался, то есть отношение один к одному.
lazy - что ето такое, я так и не понял, но без него не работает, вываливается ошибка хибера: could not initialize proxy - no Session.
И вышеописанный запрос делается так:
Код: java
1.
session.createQuery("from Supplier").list();


Смешно, однако... Дело было не в запросе а в маппинге, насколько я понял.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate + Swing
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]