Hibernate i niewłaściwe generowanie zapytań SQL

0

Cześć,
Nie ukrywam, że problem jest raczej z tych trywialnych. Mam pewną tabelę w bazie danych PostgreSQL

CREATE TABLE "gupsyMessages"
(
  "rowId" serial NOT NULL,
  "timestamp" timestamp without time zone, -- timestamp otrzymania ramki z gatewaya
  "resultX1" smallint,
  "resultY1" smallint,
  "resultZ1" smallint,
  "resultX2" smallint,
  "resultY2" smallint,
  "resultZ2" smallint,
  "Xmin" smallint,
  "Ymin" smallint,
  "Zmin" smallint,
  "Xmax" smallint,
  "Ymax" smallint,
  "Zmax" smallint,
  "samplesCount" smallint,
  battery smallint,
  CONSTRAINT "gupsyMessages_pKey" PRIMARY KEY ("rowId")
)

W Javie mam napisaną klasę z odpowiednimi adnotacjami Hibernate, która ma służyć do obsługi tej tabeli

@Entity
@Table(name="\"gupsyMessages\"")
public class LoraMessage {
	
	@Id
    @GenericGenerator(
            name = "table", 
            strategy = "enhanced-table", 
            parameters = {
                @org.hibernate.annotations.Parameter(
                    name = "\"gupsyMessages\"", 
                    value = "\"gupsyMessages_rowId_seq\""
                )
        })
        @GeneratedValue(generator = "table", strategy=GenerationType.TABLE)
	private int id;
	
	@Column(name="timestamp")
	private DateTime timestamp;
	
	@Column(name="\"resultX1\"")
	private short resultX1;
	@Column(name="\"resultY1\"")
	private short resultY1;
	@Column(name="\"resultZ1\"")
	private short resultZ1;
	
	@Column(name="\"resultX2\"")
	private short resultX2;
	@Column(name="\"resultY2\"")
	private short resultY2;
	@Column(name="\"resultZ2\"")
	private short resultZ2;
	
	@Column(name="\"Xmin\"")
	private short Xmin;
	@Column(name="\"Ymin\"")
	private short Ymin;
	@Column(name="\"Zmin\"")
	private short Zmin;
	
	@Column(name="\"Xmax\"")
	private short Xmax;
	@Column(name="\"Ymax\"")
	private short Ymax;
	@Column(name="\"Zmax\"")
	private short Zmax;
	
	@Column(name="\"samplesCount\"")
	private short samplesCount;
	@Column(name="battery")
	private short battery;
	
	public LoraMessage() {
		
	}
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}

// analogicznie reszta getterów i setterow

Jest też oczywiście main

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Configuration factoryConf = new Configuration();
      
        factoryConf.configure("hibernate.cfg.xml");

        SessionFactory sessionFactory = factoryConf.buildSessionFactory();
 
        Session session = sessionFactory.openSession();
        session.beginTransaction();
 
        LoraMessage message = (LoraMessage) session.load(LoraMessage.class, new Integer(1));
 
        session.close();
        sessionFactory.close();
	}

Problem polega na tym, że gdy debuguje swój kod widzę, że Hibernate w dziwny i niepoprawny sposób generuję zapytanie SQL do bazy.

 Hibernate: select loramessag0_.id as id1_0_0_, loramessag0_."Xmax" as Xmax2_0_0_, loramessag0_."Xmin" as Xmin3_0_0_, loramessag0_."Ymax" as Ymax4_0_0_, loramessag0_."Ymin" as Ymin5_0_0_, loramessag0_."Zmax" as Zmax6_0_0_, loramessag0_."Zmin" as Zmin7_0_0_, loramessag0_.battery as battery8_0_0_, loramessag0_."resultX1" as resultX9_0_0_, loramessag0_."resultX2" as resultX10_0_0_, loramessag0_."resultY1" as resultY11_0_0_, loramessag0_."resultY2" as resultY12_0_0_, loramessag0_."resultZ1" as resultZ13_0_0_, loramessag0_."resultZ2" as resultZ14_0_0_, loramessag0_."samplesCount" as samples15_0_0_, loramessag0_.timestamp as timesta16_0_0_ from "gupsyMessages" loramessag0_ where loramessag0_.id=?
14:12:30.844 [main] ERROR org.hibernate.engine.jdbc.spi.SqlExceptionHelper - BŁĄD: kolumna loramessag0_.id nie istnieje
  Pozycja: 8

Pytanie dlaczego jest tam ten: "loramessag0_" i skąd hibernate to bierze? Jak zmienić to zachowanie aby było np: "gupsyMessages".id ?

0

Wygenerowane zapytanie jest właściwe według tego, co oznaczyłeś adnotacjami w kodzie. Jeżeli nie dodasz adnotacji

@Column(name="")

to Hibernate uzna, że nazwa pola jest nazwą kolumny. Nie robi żadnego zgadywania. W twoim przypadku nad polem id powinieneś umieścić adnotację@Column(name="rowId")


Druga kwestia: Nazwa `loramessag0_` bieże się z tego, że Hibernate generując zapytania zawsze ustawia sobie aliasy. W tym przypadku widać to we fragmencie `from "gupsyMessages" loramessag0_`, co może być również zapisane jako `from "gupsyMessages" as loramessag0_`
0

Dlaczego masz:
@Column(name="\"resultX1\"")
przecież wystarczy:
@Column(name="resultX1")

0

Temat został rozwiązany ale wyjaśnie o co chodziło... Nazwy pól w tabelach w moim przypadku wyglądają np tak: resultX1 i bez ujęcia w cudzysłowie PostreSQL interpretował zapytania z Hibernate jako resultx1, czyli zamieniał wszystko na małe litery

1 użytkowników online, w tym zalogowanych: 0, gości: 1