当前位置: 首页 > 知识库问答 >
问题:

Spring规范中的即时获取

蒯宏达
2023-03-14

我们有一个媒体对象:

public class Media implements Serializable {

    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(insertable = false, updatable = false)
    private Long id;
    // other attributes
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "channelId", referencedColumnName = "id")
    private Channel channel;
    // getters, setters, hashCode, equals, etc.

}

通道父级的急切获取在常规存储库方法中有效,但在使用规范时无效。

规格如下:

public class MediaSpecs {

public static Specification<Media> search(final Long partnerId, final Integer width, final Integer height,
        final String channelType) {

    return new Specification<Media>() {

        @Override
        public Predicate toPredicate(Root<Media> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
            Predicate restrictions = cb.equal(root.get("archived"), false);
            // other restrictions are and-ed together
            if (channelType != null) {
                    Join<Media, ChannelType> join = root.join("channel").join("orgChannelType").join("type");
                restrictions = cb.and(cb.equal(join.get("type"), channelType));
            }
            return restrictions;
        }
    };
}

当指定channelType时,“搜索”规范正常工作,因此连接正在工作。如何指定应急切获取连接?

我尝试添加

Fetch<Media, ChannelType> fetch = root.fetch("channel").fetch("orgChannelType").fetch("type");

然后Hibernate抛出一个异常:

组织。冬眠QueryException:查询指定了联接获取,但所获取关联的所有者不在选择列表中[FromElement{explicit,not a collection join,fetch join,fetch non lazy properties,classAlias=generatedAlias4。。。

如何将关联添加到选择列表?

谢谢。

共有3个答案

夏侯弘光
2023-03-14

有同样的问题。计数选择是问题所在。if声明说明一切都对我有用

程禄
2023-03-14

例如:

public Predicate toPredicate(Root<Person> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
                if (Long.class != query.getResultType()) {
                    root.fetch(Person_.addresses);
                }
                return cb.conjunction();
            }
金子轩
2023-03-14

我想您对计数查询有问题。该规范通常用于数据查询和计数查询。对于计数查询,没有“媒体”。我使用此解决方法:

Class<?> clazz = query.getResultType();
if (clazz.equals(Media.class)) {
    root.fetch("channel");
}

这只对数据查询使用获取,而不是计数查询。

 类似资料:
  • 我将hibernate-orm与spring-data-jpa一起使用。我有三个实体、、声明如下: 我的目标是获得A和获取b的列表,在实体C上有一些条件,而不获取它。以下JPQL工作正常。 当我尝试使用JPA规范时,我的规范如下所示: 我正在重用由fetch操作完成的隐式连接。此连接不符合规范。它输出以下JPQL。 也就是说,没有别名。 我研究了Hibernate GitHub的源代码。我发现,有

  • 我正在尝试使用Spring数据JPA Specification来查询数据,但这里有一些问题。Java代码如下: 当我注释代码“收件人NoticeJoin.fetch(UserNoticeEntity_. user, JoinType. INNER);”时,它工作正常,但当我取消注释时,我会得到错误: 所以,我想知道使用规范方式是否支持连接获取,或者我的代码有问题。我知道使用@Query(“一些h

  • 问题内容: 任何人都可以帮助我了解什么是mysql中的规范化,在这种情况下以及我们需要如何使用它。 提前致谢。 问题答案: 我试图在这里尝试用外行术语解释标准化。首先,它适用于关系数据库(Oracle,Access,MySQL),因此不仅适用于MySQL。 规范化是要确保每个表都只有最小的字段并摆脱依赖关系。假设您有一个员工记录,而每个员工都属于一个部门。如果将部门与员工的其他数据一起存储为字段,

  • 有一个使用属性表达式的查询:https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-方法。查询属性表达式: 试图通过规范执行查询: 我得到了一个错误: 我做错了什么或忘记添加了什么? 查询:按教师姓名显示所有学生 基地实体: 实体教师: 实体学生: 实体教室: 实体教室:

  • Number,String,Boolean和Object 不要使用如下类型Number,String,Boolean或Object。 这些类型指的是非原始的装盒对象,它们几乎没在JavaScript代码里正确地使用过。 /* 错误 */ function reverse(s: String): String; 应该使用类型number,string,and boolean。 /* OK */ fu

  • 参数规范 参数前带* 表示必填 参数命名采用小写加下划线形式 请求每个接口时,在 header里带上 XX-Token(用户 token),XX-Device-Type(类型:mobile,android,iphone,ipad,web,pc,mac,wxapp),XX-Api-Version(比如1.0.0),XX-Wxapp-AppId(小程序 AppId) 返回结果 参数命名采用小写加下划线