zoukankan      html  css  js  c++  java
  • 通过JPA注解映射视图的实体类 jpa 视图 无主键 @Query注解的用法(Spring Data JPA) jpa 使用sql语句

    参考: https://blog.csdn.net/qq465235530/article/details/68064074

    https://www.cnblogs.com/zj0208/p/6008627.html

    这里主要说一下怎么用jpa映射一个视图的实体类,其实跟表映射一样,就是需要添加一个空的主键id标识

    package com.cf.bus.core.rs.template.domain;

    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.Id;
    import javax.persistence.Table;


    @Entity
    @Table(name = "v_sc_template") // 这个是视图名称
    public class SupplyChainTemplate {
    @Id // 添加一个空的id标识,因为jpa在映射实体是需要一个id,这个必须
    @Column(name = "name")
    private String name;
    @Column(name = "industry")
    private String industry;
    @Column(name = "com_type")
    private String comType;
    @Column(name = "remarks")
    private String remarks;

    public String getName() {
    return name;
    }

    public void setName(String name) {
    this.name = name;
    }

    public String getIndustry() {
    return industry;
    }

    public void setIndustry(String industry) {
    this.industry = industry;
    }

    public String getComType() {
    return comType;
    }

    public void setComType(String comType) {
    this.comType = comType;
    }

    public String getRemarks() {
    return remarks;
    }

    public void setRemarks(String remarks) {
    this.remarks = remarks;
    }
    }


    @id一定要有,否则会报构建entityManagerFactory异常。

    ---------------------
    作者:C7BF
    来源:CSDN
    原文:https://blog.csdn.net/qq465235530/article/details/68064074?utm_source=copy
    版权声明:本文为博主原创文章,转载请附上博文链接!

    参考文章:http://www.tuicool.com/articles/jQJBNv

    1. 一个使用@Query注解的简单例子

    @Query(value = "select name,author,price from Book b where b.price>?1 and b.price<?2")
    List<Book> findByPriceRange(long price1, long price2);

    2.  Like表达式

    @Query(value = "select name,author,price from Book b where b.name like %:name%")
    List<Book> findByNameMatch(@Param("name") String name);

    3. 使用Native SQL Query

    所谓本地查询,就是使用原生的sql语句(根据数据库的不同,在sql的语法或结构方面可能有所区别)进行查询数据库的操作。

    @Query(value = "select * from book b where b.name=?1", nativeQuery = true)
    List<Book> findByName(String name);

    4. 使用@Param注解注入参数

    @Query(value = "select name,author,price from Book b where b.name = :name AND b.author=:author AND b.price=:price")
    List<Book> findByNamedParam(@Param("name") String name, @Param("author") String author,
            @Param("price") long price);

    5. SPEL表达式(使用时请参考最后的补充说明)

       '#{#entityName}'值为'Book'对象对应的数据表名称(book)。

    public interface BookQueryRepositoryExample extends Repository<Book, Long>{

           @Query(value = "select * from #{#entityName} b where b.name=?1", nativeQuery = true)
           List<Book> findByName(String name);

    }

    6. 一个较完整的例子

    复制代码
    public interface BookQueryRepositoryExample extends Repository<Book, Long> {
        @Query(value = "select * from Book b where b.name=?1", nativeQuery = true) 
        List<Book> findByName(String name);// 此方法sql将会报错(java.lang.IllegalArgumentException),看出原因了吗,若没看出来,请看下一个例子
    
        @Query(value = "select name,author,price from Book b where b.price>?1 and b.price<?2")
        List<Book> findByPriceRange(long price1, long price2);
    
        @Query(value = "select name,author,price from Book b where b.name like %:name%")
        List<Book> findByNameMatch(@Param("name") String name);
    
        @Query(value = "select name,author,price from Book b where b.name = :name AND b.author=:author AND b.price=:price")
        List<Book> findByNamedParam(@Param("name") String name, @Param("author") String author,
                @Param("price") long price);
    
    }
    复制代码

    7.  解释例6中错误的原因:

         因为指定了nativeQuery = true,即使用原生的sql语句查询。使用java对象'Book'作为表名来查自然是不对的。只需将Book替换为表名book。

    @Query(value = "select * from book b where b.name=?1", nativeQuery = true)
    List<Book> findByName(String name);

    补充说明(2017-01-12):

      有同学提出来了,例子5中用'#{#entityName}'为啥取不到值啊?

      先来说一说'#{#entityName}'到底是个啥。从字面来看,'#{#entityName}'不就是实体类的名称么,对,他就是。

      实体类Book,使用@Entity注解后,spring会将实体类Book纳入管理。默认'#{#entityName}'的值就是'Book'。

      但是如果使用了@Entity(name = "book")来注解实体类Book,此时'#{#entityName}'的值就变成了'book'。

      到此,事情就明了了,只需要在用@Entity来注解实体类时指定name为此实体类对应的表名。在原生sql语句中,就可以把'#{#entityName}'来作为数据表名使用。

      

  • 相关阅读:
    ASP.NET编程的十大技巧
    C#学习心得(转)
    POJ 1177 Picture (线段树)
    POJ 3067 Japan (树状数组)
    POJ 2828 Buy Tickets (线段树)
    POJ 1195 Mobile phones (二维树状数组)
    HDU 4235 Flowers (线段树)
    POJ 2886 Who Gets the Most Candies? (线段树)
    POJ 2418 Cows (树状数组)
    HDU 4339 Query (线段树)
  • 原文地址:https://www.cnblogs.com/suizhikuo/p/9803751.html
Copyright © 2011-2022 走看看