Spring boot JPA & Criteria API - 选择单列

我正在尝试从表中检索单个列,但出现有关返回类型的编译错误。


数据库


select oComment from comment where oNote = note and version > 0;

我有Comment桌子和Note桌子。评论表有comment, note and version列。评论本身就是一个注释。现在我想检索版本大于 0 的注释的所有评论。但是在这里我只想要注释类型的注释列。


Comment.java


    @Entity

    @Table(name="comment")

    @Cache(usage=CacheConcurrencyStrategy.READ_WRITE, region="comments")

    public class Comment implements Serializable {


        private static final long serialVersionUID = -4420192568334549165L;


        public Comment() {

        }


        @Id

        @OneToOne

        @JoinColumn(name="commentuuid",referencedColumnName="noteuuid")

        private Note oComment;


        @Id

        @OneToOne

        @JoinColumn(name="noteuuid",referencedColumnName="noteuuid")

        private Note oNote;

}

Note.java


@Entity

@Table(name = "note")

@Cache(usage=CacheConcurrencyStrategy.READ_WRITE, region="notes")

public class Note implements Serializable{


    private static final long serialVersionUID = 4089174391962234433L;


    @Column(name="title")

    private String m_szTitle;


    @Column(name="htmlcontent")

    private String m_sbHtmlContent;


    @Column(name="textcontent")

    private String m_sbTextContent;


    @Id

    @Column(name="noteuuid", columnDefinition="varchar(36)")

    private String noteUuid;

}

自定义存储库方法


public List<Note> findAllByNote(Note oNote, int iOffset, int iResultSize) {


        CriteriaBuilder cb = em.getCriteriaBuilder();

        CriteriaQuery<Comment> cq = cb.createQuery(Comment.class);


        Root<Comment> oComment = cq.from(Comment.class);

        List<Predicate> predicates = new ArrayList<>();


        predicates.add(cb.equal(oComment.get("oNote"), oNote));

        predicates.add(cb.greaterThan(oComment.get("version"), 0));




慕丝7291255
浏览 124回答 4
4回答

江户川乱折腾

在CustomRepositoryMethod中将第一行替换CriteriaQuery<Comment> cq = cb.createQuery(Comment.class);为CriteriaQuery<Note> cq = cb.createQuery(Note.class)cb.createQuery参数在您可以看到的文档中接受结果类。更新// assuming query like// select oComment from comment inner join Note on comment.noteuuid=Note.noteuuid where Note.noteUuid = 1 and version > 0;CriteriaBuilder cb = em.getCriteriaBuilder();// data type of oCommentCriteriaQuery<Note> query = cb.createQuery(Note.class);// from commentRoot<Comment> comment = query.from(Comment.class);//joinJoin<Comment, Note> note = comment.join(comment.get("oNote"));//version ConditionPredicate version=cb.greaterThan(comment.get("version"),0 );//Note conditionpredicate note=cb.equal(note.get("noteuuid"),note.getNoteUuid());// get oComment and where condtion&nbsp;query.select(comment.get("oComment")).where(cb.and(version,note));&nbsp; &nbsp; return&nbsp; em.createQuery(query).setFirstResult(iOffset).setMaxResults(iResultSize).getResultList();

千巷猫影

您的条件查询的根Comment不是NoteCriteriaBuilder cb = em.getCriteriaBuilder();CriteriaQuery<Comment> cq = cb.createQuery(Comment.class);Root<Comment> oComment = cq.from(Comment.class);你正在尝试做return (List<Note>)em.createQuery(cq).setFirstResult(iOffset).setMaxResults(iResultSize).getResultList();在这种情况下编译错误是不可避免的,因为不会em.createQuery(cq).getResultList()返回List<Comment>List<Note>

HUH函数

没有必要编写自定义存储库方法,因为您正在创建的存储库方法已经在 spring-data 中生成。如果您的存储库扩展了 CrudRepository,您将免费获得您正在寻找的方法。模式是 findAllBy[propertyOfClass]。但请注意,您的实体中实际上没有 Collection of NOTE。也许您应该首先将 OneToOne 关联更改为 OneToMany。

SMILET

可以构建为条件查询,如下所示:CriteriaQuery<Country> q = cb.createQuery(Country.class);Root<Country> c = q.from(Country.class);q.select(c.get("currency")).distinct(true);该select方法采用一个 Selection 类型的参数并将其设置为 SELECT 子句内容。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java