为了账号安全,请及时绑定邮箱和手机立即绑定

Spring boot JPA & Criteria API - 选择单列

Spring boot JPA & Criteria API - 选择单列

慕丝7291255 2023-02-23 17:24:44
我正在尝试从表中检索单个列,但出现有关返回类型的编译错误。数据库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));
查看完整描述

4 回答

?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

在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 oComment

CriteriaQuery<Note> query = cb.createQuery(Note.class);

// from comment

Root<Comment> comment = query.from(Comment.class);


//join

Join<Comment, Note> note = comment.join(comment.get("oNote"));


//version Condition

Predicate version=cb.greaterThan(comment.get("version"),0 );


//Note condition

predicate note=cb.equal(note.get("noteuuid"),note.getNoteUuid());


// get oComment and where condtion 

query.select(comment.get("oComment")).where(cb.and(version,note));


    return  em.createQuery(query).setFirstResult(iOffset).setMaxResults(iResultSize).getResultList();



查看完整回答
反对 回复 2023-02-23
?
千巷猫影

TA贡献1829条经验 获得超7个赞

您的条件查询的根Comment不是Note


CriteriaBuilder 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>


查看完整回答
反对 回复 2023-02-23
?
HUH函数

TA贡献1836条经验 获得超4个赞

没有必要编写自定义存储库方法,因为您正在创建的存储库方法已经在 spring-data 中生成。

如果您的存储库扩展了 CrudRepository,您将免费获得您正在寻找的方法。

模式是 findAllBy[propertyOfClass]。

但请注意,您的实体中实际上没有 Collection of NOTE。

也许您应该首先将 OneToOne 关联更改为 OneToMany。


查看完整回答
反对 回复 2023-02-23
?
SMILET

TA贡献1796条经验 获得超4个赞

可以构建为条件查询,如下所示:


CriteriaQuery<Country> q = cb.createQuery(Country.class);


Root<Country> c = q.from(Country.class);


q.select(c.get("currency")).distinct(true);

该select方法采用一个 Selection 类型的参数并将其设置为 SELECT 子句内容。


查看完整回答
反对 回复 2023-02-23
  • 4 回答
  • 0 关注
  • 123 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信