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

JPA:没有@OneTomany注释的左联接

田镜
2023-03-14
@Entity
@Table(name = "my_table")
public class MyTable {

    @Id
    @Column(name = "id", nullable = false, unique = true)
    private Integer id;

    @Transient
    private String lang;

    @Transient
    private String text;

    // getters and setters
    ...
}

@Entity
@Table(name = "my_table_translation")
public class MyTableTranslation {

    @Id
    @Column(name = "id", nullable = false, unique = false)
    private Integer id;

    @Id
    @Column(name = "lang", nullable = false, unique = false, length = 2)
    private String lang;

    @Column(name = "text", nullable = false, unique = false, length = 200)
    private String text;

    // getters and setters
    ...
}
public void findAll(String language) {
    List<MyTable> list = repository.findAll(new Specification<MyTable>() {
        @Override
        public Predicate toPredicate(Root<MyTable> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
            // something there
            return ...;
        }
    });
}
SELECT t1, t2 FROM MyTable t1 LEFT JOIN MyTableTranslation t2 ON t1.id = t2.id

我想它不干净...有没有人知道如何在不使用SQL符号的情况下使它变得简单?

共有1个答案

田志尚
2023-03-14

我尝试使用@OneTomany注释,我更改了我的DTO:

@Entity
@Table(name = "my_table")
public class MyTable {

    @Id
    @Column(name = "id", nullable = false, unique = true)
    private Integer id;

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinColumn(name = "id", referencedColumnName = "id")
    private List<MyTableTranslation> translations = new ArrayList<MyTableTranslation>();

    // getters and setters
    ...
}

并将标准更改为:

public void findAll(String isolang) {
    List<MyTable> list = repository.findAll(new Specification<MyTable>() {
        @Override
        public Predicate toPredicate(Root<MyTable> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
            Join<Object, Object> langJoin = root.join("translations", JoinType.LEFT);
            return cb.equal(langJoin.get("lang"), isolang);
        }
    });
}

但列表中没有项目。如果我将FetchType更改为EAGER,谓词没有效果,我将得到所有的语言。我不知道现在该怎么继续...

 类似资料:
  • 问题内容: 我有两个表之间的父/子关系,以及我的Java类中的对应映射。这些表大致如下所示: 和Java代码: 这可以正常工作,但是我想在从子表中检索的行上添加一个过滤器。生成的查询如下所示: 我希望它是: 附加过滤器将只是列名和硬编码值。有没有一种方法可以使用hibernate注释? 我已经看过了,但是我总是必须从父表中引用一个列名(在JoinFormula 的属性中)。 在此先感谢您的任何建议

  • 我正在开发一个应用程序,使用: Java 1.7 我想对一些字符串属性使用PostgreSQL文本数据类型。据我所知,在JPA中,要使用PostgreSQL中的文本,这应该是正确的注释: 当我像这样注释我的实体时,我遇到的错误如下所示:http://www.shredzone.de/cilla/page/299/string-lobs-on-postgresql-with-hibernate-36

  • 问题内容: 这是我的namedquery: @NamedQuery(name =“ User.findOneWithLists”,查询=“从用户u中选择u” +“左联接FEACH u.aTemplates” +“左联接FE.bTemplates” +“左联接FE.bp” +“左JOIN FETCH u.aCredentials“ +” LEFT JOIN FETCH u.st(st.deleted

  • 问题内容: 这与“没有单独的联接表的hibernate@OneToMany”类似,因为我需要一个没有联接表的@OneToMany关系。但是,我也不想定义逆关系。删除相反的内容似乎会导致自动生成联接表…是否有解决方法? 问题答案: 在JPA 2.0+中,您可以使用@JoinColumn作为避免生成联接表的方法。 尝试一下。 更新 上面提供的信息摘自EJB 3.0o’illy书(查找@JoinColu

  • 我是一个新的探索Spring启动和冬眠,并面临一个问题,我认为这并不是新的。然而,在所有的建议都到位的情况下,我仍然找不到一个方法来解决我目前面临的问题。 你们谁能指出我错在哪里吗? 以下是场景- 我有一个Category类,并且Category类的每个实例可以有许多子Category的实例。 我已经使用@OneTomany注释设置了关系。然而,当试图将记录保存到数据库时,我面临的是org.hib

  • 现在表1和表2没有使用外键的直接关系。对应的JPA实体如下所示: 我的代码看起来像: 则尝试使用以下方法获取值: Table2有大约6列带有@id注释,而我不能将它更改为只有两列带有@id注释。 请告诉我: > 如果有可能为我的方法1(select子句中的子查询)使用CriteriaBuilder编写代码。 请注意,我使用的是普通的JPAAPI。DB是Oracle11g。JDK版本为1.7。