2017-02-17 12 views
0

Я использую весной, JPA, Hibernate, MySQL, Java 8, .В Dao (который inteface и расширяет JpaRepository) MyTable классКак отображение подзапрос в выберите с JPA

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

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

    @Id 
    @Column(name = "ID") 
    private long id; 
    @Column(name = "ITEM_NAME") 
    private String itemName; 
    @Column(name = "ITEM_PRICE") 
    private int itemPrice; 
    @Transient 
    private int col1; 

    public MyTable() { 
    } 
    public MyTable(long id, String itemName, int itemPrice, int col1) { 
     super(); 
     this.id = id; 
     this.itemName = itemName; 
     this.itemPrice = itemPrice; 
     this.col1 = col1; 
    } 
    public long getId() { 
     return id; 
    } 
    public void setId(long id) { 
     this.id = id; 
    } 
    public String getItemName() { 
     return itemName; 
    } 
    public void setItemName(String itemName) { 
     this.itemName = itemName; 
    } 
    public int getItemPrice() { 
     return itemPrice; 
    } 
    public void setItemPrice(int itemPrice) { 
     this.itemPrice = itemPrice; 
    } 
    public int getCol1() { 
     return col1; 
    } 
    public void setCol1(int col1) { 
     this.col1 = col1; 
    } 


} 

MyTableDao

import java.util.List; 

import org.springframework.data.jpa.repository.JpaRepository; 
import org.springframework.data.jpa.repository.Query; 

import com.kolip.devchain.model.MyTable; 

public interface MyTableDao extends JpaRepository<MyTable , Long> { 

    @Query(value = "SELECT mt.*, (select count(1) from anotherTable) as col1 from MY_TABLE mt",nativeQuery = true) 
    List<MyTable> getMyTableList(); 
} 

пОМ

<parent> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-parent</artifactId> 
     <version>1.4.0.RELEASE</version> 
     <relativePath/> <!-- lookup parent from repository --> 
    </parent> 

    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 
     <java.version>1.8</java.version> 
    </properties> 

    <dependencies> 
<!--  <dependency> --> 
<!--   <groupId>org.springframework.boot</groupId> --> 
<!--   <artifactId>spring-boot-starter-security</artifactId> --> 
<!--  </dependency> --> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-web</artifactId> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-test</artifactId> 
      <scope>test</scope> 
     </dependency> 

      <dependency> 
    <groupId>mysql</groupId> 
    <artifactId>mysql-connector-java</artifactId> 
    <version>5.1.38</version> 
</dependency> 

<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-core</artifactId> 
    </dependency> 

    <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-tx</artifactId> 

     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-orm</artifactId> 

     </dependency> 

     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-data-jpa</artifactId> 
     </dependency> 

     <dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-entitymanager</artifactId> 

</dependency> 

     <dependency> 
    <groupId>com.github.stefanbirkner</groupId> 
    <artifactId>system-rules</artifactId> 
    <version>1.16.0</version> 
</dependency> 

     <dependency> 
      <groupId>org.scala-lang</groupId> 
      <artifactId>scala-library</artifactId> 
      <version>2.11.0</version> 
     </dependency> 
     <dependency> 
      <groupId>com.fasterxml.jackson.datatype</groupId> 
      <artifactId>jackson-datatype-hibernate5</artifactId> 
     </dependency> 
    </dependencies> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-maven-plugin</artifactId> 
      </plugin> 
     </plugins> 
    </build> 

MY_TABLE

CREATE TABLE `my_table` (
    `ID` bigint(20) NOT NULL, 
    `ITEM_NAME` varchar(255) DEFAULT NULL, 
    `ITEM_PRICE` int(11) DEFAULT NULL, 
    PRIMARY KEY (`ID`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

Я стараюсь, чтобы упростить мои problem.I попытаться получить col1 значение, но я не могу выяснить, как должно быть col1 атрибут в сущности. Другие значения могут быть получены в сущности.

Если я использую атрибут col1 без @Transient, он будет работать, но col1 не является постоянным (также findAll() не работает, потому что на db нет столбца col1). Что мне делать ?

+0

Возможный дубликат [Spring Data JPA сопоставляет результат с объектом не Entity POJO] (http://stackoverflow.com/questions/29082749/spring-data-jpa-map-the-result-to-non -entity-pojo) – Naros

+0

Не получилось. Вы должны предоставить более подробную информацию о значениях в таблице, чтобы мы могли разработать класс сущности для вас. – Akshay

ответ

1

у вас есть много вариантов, но вы могли бы попробовать это следующие шаги, если вы используете JPA 2.1:

1) Создайте подходящий DTO, который должен включать в себя свойство, которые будут принимать результаты запроса: «SELECT мта . *, (выберите count (1) from anotherTable) в качестве col1 из MY_TABLE mt "

2) В объекте MyTable сопоставьте собственный запрос с DTO с помощью аннотаций @SqlResultSetMapping и @ConstructorResult (простой поиск в google предоставит вам много полезной информации об их использовании). (См. http://docs.oracle.com/javaee/7/api/javax/persistence/SqlResultSetMapping.html)

3) Измените MyTableDao, чтобы использовать собственный запрос, который вы создали на шаге 2.

Надеюсь, это поможет. Goodluck :)

+0

Мне это понравилось, но я сопоставляю собственный запрос с тем же объектом и использую namednativequery для использования в jparepository. Но это не выглядит чистым, потому что запрос находится в классе сущности, я пытаюсь сохранить их все в dao. Также мне интересно, могу ли я сопоставить только переходный атрибут, а другие отображаются по умолчанию? – uuur