在没有jpql的情况下连接两个表

v1uwarro  于 2021-06-29  发布在  Java
关注(0)|答案(3)|浏览(253)

我必须mysql表票证是父和用户是子,在一个多对一的关系。

=TICKET=
PK(ID)
summary
message
FK(user_id) references USER(user_id)

=USER=
PK(ID)
email
password

以及jpa实体

@Entity 
class TICKET {
    @Id
    private Integer ID;
    private String summary;
    private String message;
    @ManyToOne
    @JoinColumn(name="user")
    private USER user;
}

@Entity
class USER {
    @Id
    private Integer ID;
    private String email;
    private String password;
}

如果我通过id查询到一张票,它也会返回不好的用户信息(user.id,user.email,user.password)。

ticketsCrudRepository.findById(ticketId);

我想要的是一张这样的table:

TICKET.ID | summary | message | USER.email

我知道如何在mysql中实现它,但是jpa对我来说太多了。我不想使用jpql或本机查询语言。有什么建议吗?

brtdzjyr

brtdzjyr1#

使用spring数据投影是一种选择,但您会在某个时候遇到它的局限性。如果达到这一点,就可以查看blaze持久性实体视图。
我创建了这个库,以便在jpa模型和自定义接口或抽象类定义的模型之间进行简单的Map,比如spring数据在steroids上的投影。其思想是以您喜欢的方式定义目标结构(域模型),并通过jpql表达式将属性(getter)Map到实体模型。
对于blaze持久性实体视图,用例的dto模型可以如下所示:

@EntityView(TICKET.class)
public interface TicketDto {
    @IdMapping
    Long getId();
    String getName();
    UserDto getUser();

    @EntityView(USER.class)
    interface UserDto {
        @IdMapping
        Long getId();
        String getEmail();
    }
}

或者更简单

@EntityView(TICKET.class)
public interface TicketDto {
    @IdMapping
    Long getId();
    String getName();
    @Mapping("user.email")
    String getUserEmail();
}

查询是将实体视图应用于查询的问题,最简单的就是按id进行查询。 TicketDto a = entityViewManager.find(entityManager, TicketDto.class, id); spring数据集成允许您像spring数据投影一样使用它:https://persistence.blazebit.com/documentation/entity-view/manual/en_us/index.html#spring-数据特征

xzv2uavs

xzv2uavs2#

当你拿到一张票的时候,你也会得到一个用户 @ManyToOne 默认情况下 FetchType.EAGER . 你可以通过把涂鸦改成 @ManyToOne(fetch = FetchType.LAZY) 做搜索你可以试试

public List<Object[]> getTikcetsForUser(final User user) {
   String hql = "select t.id, t.summary, t.message, u.email "
                + "from Tikcet t, User u "
                + "where ticket.user = :user";

   Query<Object[]> query = getSession().createQuery(hql, Object[].class);
   query.setParameter("user", user);
   return query.getResultList();
}

返回的列表将包含4个字段(t.id、t.summary、t.message、u.email)的数组。
如果你觉得这个有用,请告诉我。
:)

0dxa2lsx

0dxa2lsx3#

我正在寻找的解决方案是spring数据jpa投影。它们可以是接口或类,其getter与要从数据库中获取的列相匹配。有关详细信息,请查看此处的spring框架文档。

相关问题