0

我最近开始使用 Hibernate,并试图了解所有注释并确保我做事正确。我有两个类似于下面的表'user'和'user_friends'

+------+------+-------+------+
| id   | name | email | etc. |
+------+------+-------+------+

和用户朋友表

+--------+---------+----------+
| userid | buddyid | accepted |
+--------+---------+----------+

现在在 SQL 中,我运行了一个看起来类似于

SELECT u.id AS id, u.name AS username, u.email AS email FROM user_friends 
INNER JOIN users AS u ON u.id = '1' WHERE buddyid = '2' AND ACCEPTED = 1 UNION ALL 
SELECT u.id as id, u.name AS username, u.email AS email FROM user_friends
INNER JOIN users AS u ON u.id = '2' WHERE buddyid = '1' AND ACCEPTED = 1;

我在 Java 设置中有两个类,其方式与此类似

@Entity
@Table(name="users")
public class User {

  @Id
  @GeneratedValue
  private int id;

  private int name;
  private int email;

  private DateTime registerDate;
  private DateTime lastActivity;

  private int currency;
  private int seasonCurrency;

  @OneToMany(fetch=UserBuddy.class, mappedBy="user", fetch=FetchType.LAZY)
  @JoinColumn(name="userid")
  @Filter(name="messengerBuddyFilter", condition="accepted=1")
  private Set<UserBuddy> _buddies;
}

@Entity
@Table(name="user_friends")
public class UserBuddy {

   private int id;
   private int name;
   private int email;
}

我之前问过这个问题,但仍然无法按照我的意愿进行工作。我需要能够返回一组 UserBuddy.class,其中包含该好友的姓名和电子邮件,没有其他内容,而不是他们的注册时间等(通过使用 User 类进行映射)。我也很难确保它只返回接受请求的好友(ACCEPTED=1)

任何人都可以提供任何建议吗?

4

1 回答 1

0

如果您使用 JPA(并且使用 hibernate 和 JPA 的命名本机查询存在问题),则需要使用本机查询;如果仅使用纯休眠,则需要使用 IIRC sql 查询。

这可能会奏效......只要快速完成,就可以将其作为开始的地方。假设您在 JPA 中有一个名为 em 的实体管理器,定义为类成员变量

@PersistenceContext(unitName = "MyPersistenceUnit_PU")
private EntityManager em;

...

某种方法...

List<UserBudy> buddyList = new <>ArrayList();
Query q = createNativeQuery("SELECT u.id AS id, u.name AS username, u.email AS email "
                          + "FROM user_friends "
                          + "INNER JOIN users AS u "
                          + "ON u.id = '1' "
                          + "WHERE buddyid = '2' "
                          + "AND ACCEPTED = 1 "
                          + "UNION ALL "
                          + "SELECT u.id as id, u.name AS username, u.email AS email "
                          + "FROM user_friends "
                          + "INNER JOIN users AS u "
                          + "ON u.id = '2' "
                          + "WHERE buddyid = '1' "
                          + "AND ACCEPTED = 1");
List<UserBudy> buddyList = (List<UserBudy>)em.getResultList);

此示例不是“命名”本机查询。这是内联完成的,类似于 POJDBC(普通的旧 jdbc)。就像我说的那样,如果您要尝试使用 JPA 和 Hibernate 创建 NamedNativeQuery,您会得到“一些尚未实现的异常”。Hibernate 永远不支持使用 JPA 的命名本机查询。它仍然在某个地方的错误跟踪器中(已经有 5 或 6 年了),看起来他们并没有在修复它时给老鼠屁股。总的来说,我在使用 PostgreSQL 时使用 Hibernate 时遇到的问题比使用 Eclipselink 时要少,所以我现在可以忍受它。:)

IIRC 如果您要使用纯休眠来执行此操作,您将创建一个休眠会话对象而不是 JPA EM 对象,并改用 createSQLQuery。除此之外几乎相同。

IE

session.createSQLQuery("...");

如果这还不够帮助,那么您现在至少应该有足够的信息来解决这个问题。

如果您想在使用纯 JPA 后尝试一下,这里有一个链接。在本文的一半处查找“行项目摘要”示例。

http://www.oracle.com/technetwork/articles/vasiliev-jpql-087123.html

请记住,当您处理 JPA 时,您是在加入实体,而不是表。无论如何,那篇文章是我发现的最清晰的文章之一,它展示了它是如何工作的。问候。

于 2012-07-13T18:51:03.950 回答