在 Hibernate 中只获取最后一条记录,但我想要所有记录

Posted

技术标签:

【中文标题】在 Hibernate 中只获取最后一条记录,但我想要所有记录【英文标题】:Getting only last record in Hibernate but i want all records 【发布时间】:2015-11-04 18:52:42 【问题描述】:

我正在使用带有 Spring Rest 的 Hibernate。我的数据库中有两个名为 user_table 和 user_profession 的表。 user_table 包含用户信息,主键是 id。 user_profession 包含具有 u_id 外键的用户的职业。项目的工作是我将 u_id 传递给 user_profession 并现在从该专业获取用户的专业我从 user_profession 表中获取所有具有该专业的 u_id 。现在我从 user_profession 获得了许多 u_id,现在我使用 @OneToOne 映射将 user_profession 与 user_table 映射,并获得了与该 u_id 对应的用户信息。

如果一个 u_id 在 user_profession 中有一个职业,但如果一个 u_id 有多个具有多个职业的条目,那么我只会得到最后一个职业结果,而我希望如果我将一个 u_id 传递到 user_profession 表中并且如果那个 u_id有两个具有两个职业的条目,那么它可以搜索两个职业的 u_id,但它只获取第二个职业 u_id。

这是两个表的 My Entity 类。首先是 Profession.java 用于 user_profession 表

@Entity
@Table(name="user_profession")
@JsonIgnoreProperties("hibernateLazyInitializer", "handler")
public class Profession implements Serializable 


private static final long serialVersionUID = 1L;


@Id
@GeneratedValue
@Column(name="id")
private long id;

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

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


@OneToOne
@JoinColumn(name = "u_id", referencedColumnName = "id", insertable=false, updatable=false)
private User user;


//Getters and setters


public User getUser() 
    return user;



public void setUser(User user) 
    this.user = user;



public long getId() 
    return id;



public String getU_id() 
    return u_id;


public void setU_id(String u_id) 
    this.u_id = u_id;


public void setId(long id) 
    this.id = id;


public String getProfession() 
    return profession;


public void setProfession(String profession) 
    this.profession = profession;



这里是 User.java 用于 user_table

@Entity
@Table(name="user_table")
@JsonIgnoreProperties("hibernateLazyInitializer", "handler")
public class User implements Serializable 

private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue
    @Column(name="id")
    private long id;

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

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


public long getId() 
    return id;


public void setId(long id) 
    this.id = id;



public String getFullName() 
    return fullName;


public void setFullName(String fullName) 
    this.fullName = fullName;


public String getUsername() 
    return username;


public void setUsername(String username) 
    this.username = username;




这是我的DAO课程

    @SuppressWarnings("unchecked")
    public List<Profession> getProfessionById(long id) throws Exception 
    session = sessionFactory.openSession();
      session.beginTransaction();
      String queryString = "from Profession where u_id = :id";
      Query query = session.createQuery(queryString);
      query.setLong("id", id);

      List<Profession> professionList = query.list();

        String queryString1 = "from Profession where profession = :pro";
          Query query1 = null;

          for(Profession professionList1 : professionList)
            query1=session.createQuery(queryString1);
            query1.setString("pro", professionList1.getProfession());

          

      session.flush();
      session.getTransaction().commit();
      return query1.list();

【问题讨论】:

您正在循环中重新创建查询,因此只得到最后一个。在循环中调用 query1.list() 并自己收集结果,或者 - 如果可能的话更好 - 更改您的查询以在一个查询中获取所有实体。 关于您的查询的一个简单问题:为什么要通过(用户?)ID 加载Profession,然后再次加载它?似乎没有任何意义。 - 顺便说一句,请更具体地命名您的变量和方法。这将使您的代码更容易阅读,即我假设参数 id 实际上是指用户 ID 而不是职业 ID。 还有一个观察结果:您的用户 ID 的类型为 long,而职业的 u_id 类型为 String,但它似乎指的是同一列。虽然这可能不会引起问题(我自己不会这样做),但至少看起来非常不寻常,我不排除因此而出现任何细微错误。 您可以尝试使用 IN 运算符 在一个查询中获取所有实体。当前的方法一点也不好。 在 2 天内问同样的问题 3 次不会帮助您更快地得到答案。 ***.com/questions/31918205/… 和 ***.com/questions/31937320/…. 【参考方案1】:

我认为您只需一个查询即可做到这一点:

@SuppressWarnings("unchecked")
public List<Profession> getProfessionById(long id) throws Exception 
    session = sessionFactory.openSession();
    // Why would you need a transaction?
    // session.beginTransaction();
    String queryString = "SELECT p2 FROM Profession p1, Profession p2 WHERE p1.u_id=:id AND p2.profession=p1.profession";
    Query query = session.createQuery(queryString);
    query.setLong("id", id);

    return query.list();

如果您想获取与指定用户具有相同专业的所有用户,而不是所有专业条目,您必须将代码更改为类似

@SuppressWarnings("unchecked")
public List<User> getUsersWithSameProfessionsById(long id) throws Exception 
    session = sessionFactory.openSession();
    String queryString = "SELECT DISTINCT u FROM Profession p1, Profession p2 JOIN p2.user u WHERE p1.u_id=:id AND p2.profession=p1.profession";
    Query query = session.createQuery(queryString);
    query.setLong("id", id);

    return query.list();

(我知道,“DISTINCT”,不好的风格 - 你也可以使用“GROUP BY”。)

【讨论】:

非常感谢您的回复...您的代码运行良好,但我得到了 u_id 的重复,例如如果一个职业中已经存在一个 u_id,那么它也会显示为另一个职业。 .. 但我只想要一个 u_id 一次 @nad:澄清一下:即使指定用户拥有多个职业,您是否只希望每个用户拥有一个职业?如果可以,选择哪个职业? CEO 将是我的首选... :D @rostbot 不不......我想要所有职业......我是说如果任何用户有两个职业,我们搜索所有拥有这两个职业的 u_id,然后如果任何其他用户同时拥有这两个职业那么搜索结果中的两个职业都会出现这些职业......所以u_ids存在重复性。因为我只想要一个 u_id 一次。 @nad:所以实际上你的目标不是职业列表,而是用户列表?

以上是关于在 Hibernate 中只获取最后一条记录,但我想要所有记录的主要内容,如果未能解决你的问题,请参考以下文章

查询在sql服务器中只改变最后一条记录的值。

thinkphp 怎么获取多天最后一条记录

使用 INNER JOIN 获取最后一条记录

添加了Spring声明式事务 然后hibernate多次调用save(),却只保存了最后一条记录到数据库,请高手指点

如何使用聚合函数在 MySQL 查询中获取分组记录的第一条和最后一条记录?

如何使用聚合函数在 MySQL 查询中获取分组记录的第一条和最后一条记录?