как выбрать данные из списка гибернации для таблицы без первичного ключа, в которой данные предложения where одинаковы для всех столбцов - PullRequest
0 голосов
/ 01 октября 2018

Я новичок в Hibernate Framework, пожалуйста, предоставьте свое понимание этого Я хочу заполнить список на основе условия, где, но Hibernate List () возвращает избыточные / дублированные данные в списке вместо отображения всех записей, основанных наусловие where в таблице не первичного ключа, в которой данные предложения where одинаковы для всех столбцов

У меня нет возможности добавить первичный ключ.

Ниже приведен фрагмент кода

Это мой файл конфигурации hibernate.cfg.xml

<hibernate-configuration>
<session-factory>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/oracle</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">root</property>  
    <property name="show_sql">true</property>

    <mapping class="com.jspiders.app.dto.Office"/>
</session-factory>

Это мой класс DTO

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="office")
public class Office {

    @Id
    @Column(name = "id")
    private int id;

    @Column(name = "name")
    private String name;

    @Column(name = "column3")
    private String column3;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getColumn3() {
        return column3;
    }

    public void setColumn3(String column3) {
        this.column3 = column3;
    }

    @Override
    public String toString() {
        return "Office [id=" + id + ", name=" + name + ", column3=" + column3 + "]";
}

Это мой класс DAO

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.query.Query;

import com.jspiders.app.dto.Office;
import com.jspiders.app.util.HibernateUtil;

public class OfficeDAO {
    SessionFactory factory = HibernateUtil.getUtility().getSessionFactory();

    public List<Office> retrieve() {
        Session s = factory.openSession();
        Query q = s.createQuery("select distinct o from Office o where id=1");
        List<Office> list = q.list();
        for (Office oo : list) {
            System.out.println(oo.toString());
        }
       return list;
    }

Это мой синглтон-класс

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {

    private static final HibernateUtil util;
    private SessionFactory factory;

    static {
        util=new HibernateUtil();
    }

    private HibernateUtil()
    {
        Configuration cfg=new Configuration();
        cfg.configure();
        factory = cfg.buildSessionFactory();
    }


    public static HibernateUtil getUtility() {
        return util;
    }


    public  SessionFactory getSessionFactory() {
        return factory;
    }


    @Override
    protected void finalize() throws Throwable {

        if(factory!=null)
            factory.close();
    }


this snippet is from my main class
public static void main(String[] args) {

        OfficeDAO dao = new OfficeDAO();
        List<Office> list=dao.retrieve();

    }

Это создание моего офисного стола sql

CREATE TABLE oracle.office
(
id INT NOT NULL,
NAME VARCHAR(30) NOT NULL,
column3 VARCHAR(30) NOT NULL
);

Данные офисного стола

Идентификатор имени column3 1 aqwert 1 b abc

Это мой результат

Hibernate: выберите отдельный office0_.id в качестве id1_0_, office0_.column3 в качестве column2_0_, office0_.name в качестве name3_0_ из office office0_, где office0_.id = 1Офис [id = 1, name = abc, column3 = qwert]Офис [id = 1, имя = abc, column3 = qwert]

1 Ответ

0 голосов
/ 01 октября 2018

Проблема в том, что в вашей сущности вы указываете id как @Id.Чтобы это работало, оно должно иметь уникальное значение для каждой строки, что не так в данных вашего примера.Вы можете использовать составной ключ для этого.Иметь что-то вроде:

public class OfficePK implements Serializable {
    private int id;
    private String name;

    @Column(name = "id")
    @Id
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id= id;
    }

    @Column(name = "name")
    @Id
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    //equals and hashcode
}

И соответствующий класс Office будет выглядеть так:

@Entity
@Table(name="office")
@IdClass(OfficePK.class)
public class Office {

    @Id
    @Column(name = "id")
    private int id;

    @Id
    @Column(name = "name")
    private String name;

    @Column(name = "column3")
    private String column3;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getColumn3() {
        return column3;
    }

    public void setColumn3(String column3) {
        this.column3 = column3;
    }

    @Override
    public String toString() {
        return "Office [id=" + id + ", name=" + name + ", column3=" + column3 + "]";
}

Конечно, вы можете также включить column3 в качестве идентификатора.

И, кстати.вам не нужно указывать имя столбца, если имя переменной совпадает с именем столбца.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...