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

选择JPA Spring Boot中的特定列

茅和玉
2023-03-14

我想从我的表中获取一些特定的列,但我得到了这个错误:无法执行查询;SQL[按名称顺序从字符中选择名称、图像asc];嵌套的异常是org。冬眠例外SQLGrammarException:无法执行查询。

o、 引擎。jdbc。spi。SqlExceptionHelper:SQL错误:0,SQLState:42703 o.h.engine。jdbc。spi。SqlExceptionHelper:在此结果集中找不到列名id。

我想运行以下查询:

public interface CharacterRepository extends JpaRepository<CharacterEntity, Long> {
    @Query(value = "SELECT name, image FROM characters", countQuery = "SELECT COUNT(name) FROM characters", nativeQuery = true)
    Page<CharacterEntity> getCharacters(Pageable pageable);
}

我的整个班级:

@Entity(name = "characters")
@Getter @Setter
public class CharacterEntity implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue
    private long id;

    @Column(nullable = false)
    private String image;

    @Column(nullable = false, length = 100)
    private String name;

    @Column(nullable = false)
    private Integer age;

    @Digits(integer = 8, fraction = 2)
    private BigDecimal weight;

    private String story;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "character")
    private List<MovieDetailEntity> movies;

}

我的Dto课程:

@Getter @Setter
public class CharacterDto implements Serializable {

    private static final long serialVersionUID = 1L;

    private long id;
    private String image;
    private String name;
    private Integer age;
    private BigDecimal weight;
    private String story;
    private List<MovieDetailDto> movies;

    public CharacterDto() {

    }
    public CharacterDto(long id, String image, String name, Integer age, BigDecimal weight, String story) {
        this.id = id;
        this.image = image;
        this.name = name;
        this.age = age;
        this.weight = weight;
        this.story = story;
    }
}

共有3个答案

莫乐
2023-03-14

我认为这是Blaze持久性实体视图的完美用例。

我创建了这个库,以便在JPA模型和自定义接口或抽象类定义的模型之间进行简单的映射,比如Spring数据在类固醇上的投影。其思想是,您可以按照自己喜欢的方式定义目标结构(域模型),并通过JPQL表达式将属性(getter)映射到实体模型。

在Blaze Persistence实体视图中,用例的DTO模型可能如下所示:

@EntityView(CharacterEntity.class)
public interface CharacterImageDto {
    @IdMapping
    Long getId();
    String getImage();
}

查询是将实体视图应用于查询的问题,最简单的就是按id进行查询。

CharacterizeMagedTo a=entityViewManager。查找(entityManager,CharacterImageDto.class,id)

Spring数据集成让您可以像使用Spring数据投影一样使用它:https://persistence.blazebit.com/documentation/entity-view/manual/en_US/index.html#spring-数据特征

Page<CharacterImageDto> findAll(Pageable pageable);

最好的部分是,它只会获取实际需要的状态!Blaze持久实体视图也支持映射集合。

@EntityView(CharacterEntity.class)
public interface CharacterDto {
    @IdMapping
    Long getId();
    String getImage();
    Set<MovieDto> getMovies();

    @EntityView(MovieDetailEntity.class)
    interface MovieDto {
        @IdMapping
        Long getId();
        String getName();
    }
}

万开畅
2023-03-14

如果要选择自定义colum,则需要创建自定义dto并将数据加载到其中。不能将自定义数据加载到托管实体中,但可以使用jpql选择到自定义dto中。

package my.class.package;

class Chars{
    private String name;
    private IDONTKNOW image;  
    [other fields, constructors, getters,setters ...]
}

然后您可以查询:

@Query("SELECT new my.class.package.Chars(c.name,c.image) FROM characters c")
Page<Chars> getCharacters(Pageable pageable);

您还可以使用这种查询通过连接不同表(实体)来加载这些表(实体)中的字段。

例如(我的一个旧的,但也许它会帮助你):

   public class ProgrammerNameAndCity {
       private String name;
       private String city;
   }
    
    @Entity
    @Table(name = "programmer")
    public class Programmer extends BaseEntity {
    
        @Basic
        private String name;
    
        @Column(name = "id_number", nullable = false, unique = true)
        private String idNumber;
    
        //hibernate specific
        @Type(type = "yes_no")
        private Boolean senior;
    
        @Basic
        private Integer salary;
    
        @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
        @JoinColumn(name = "address_id")
        private Address address;
    
    }
    
    @Entity
    @Table
    public class Address extends BaseEntity {
    
        @Basic
        private Integer zip;
    
        @Basic
        private String city;
    
        @Basic
        private String street;
    
        @Column(name = "house_number")
        private Integer houseNumber;
    
        @OneToOne(mappedBy = "address")
        private Programmer programmer;
    
    }
    
   @Query("select new mypackage.ProgrammerNameAndCity(p.name,p.address.city) from Programmer p where  p.idNumber=?1")
   ProgrammerNameAndCity findNameAndCityByIdNumber(String idNumber);
阎懿轩
2023-03-14

您可以将返回类型更改为“页面”,而不是返回页面

@Query(value = "SELECT name, image FROM characters", countQuery = "SELECT COUNT(name) FROM characters", nativeQuery = true)
Page<Object[]> getCharacters(Pageable pageable);
 类似资料:
  • 我是一个新生的QA,我在这里尝试编写一个Protractor脚本,从下拉列表中选择一个选项。我的下拉列表中有两个选项,我正在尝试从数字中选择它。 这是我正在使用的代码。 默认情况下,选项 2 在页面加载时处于选中状态。我需要的是从下拉列表中选择选项1。但是,我的代码不会这样做。 下面是选择选项的代码片段。 提前感谢:)

  • 问题内容: 我正在使用Spring JPA执行所有数据库操作。但是我不知道如何从Spring JPA的表中选择特定的列? 例如: 问题答案: 你可以从这样的类中在注释中进行设置: 请注意,你将不得不自己进行映射。像这样使用常规映射查找可能会更容易,除非你确实只需要这两个值: 也许也值得看一下Spring数据文档。

  • 我正在使用Spring JPA执行所有数据库操作。但是,我不知道如何在Spring JPA中从表中选择特定的列? 例如:

  • 问题内容: 理想情况下,我需要一个等于 但这是非法的。 我不能使用自动递增的字段。 row_number()是需要选择的行。 我该怎么办? 编辑:嗯,我使用iSql * plus进行练习,出于某些原因,使用limit和auto_increment是非法的。我最终创建了一个序列和一个触发器,并且每次输入一个条目时,ID都增加了1。 问题答案: 您可以使用代替。 如文档所述, 第一个参数指定要返回的第

  • 我假设我可以做这样的事情,但这样会处理乐观锁情况吗(我通过表上的版本列使用它)

  • 我有这个: 我想选择类为col-md-4,6,8,12的排班的孩子。有没有什么好办法一次全选? 可以有多个行DIV,我将使用wrapAll将每个行DIV的子级包装到其他DIV中。所以如果我使用wrapAll,它只是将其他行div的所有内容转移到第一个行div。如果我将选择器查询放在循环内部,它只是继续包装子项乘以行divs的数量。我不想让这种事发生。 你们听懂了吗?