使用Spring Data JPA从数据库设置瞬态值

时间:2014-09-04 20:00:21

标签: spring jpa spring-data spring-data-jpa

我想知道是否有办法从数据库中检索生成的值作为额外的列并将其映射到瞬态值。

我会尝试解释自己,我希望这样的事情:

@Entity
@Table(name = "thing")
public class Thing {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "itemid")
    private Long itemId;

    private String someValue;

    @Transient
    private double distance;

    // constructors, getters, setters, etc.. (include transient methods)
}

Repository("thingRepository")
public interface ThingRepository extends PagingAndSortingRepository<Thing, Long> {

    @Query("SELECT t, cos(someDouble)*sin(:someDouble) AS distance FROM Thing t WHERE someValue = :someValue AND someDouble = :someDouble AND distance > 30")
    Page<Thing> findByParams(@Param("someValue") String someValue, @Param("someDouble") double someDouble, Pageable pageable);
}

我使用@Query注释来简化,所以我因此受到限制。 HAVING子句是不允许的,而当前的例子它不起作用。

由于我需要存储在数据库中的值,以及从服务传递的值,我需要从数据库进行过滤。

或者可能还有其他方法可以做到这一点?

提前谢谢。

1 个答案:

答案 0 :(得分:4)

我认为你可以做这样的事情。使用JPQL新功能使用不同的构造函数创建新实例。

  

@Query(&#34; SELECT new Thing(t,cos(t.someDouble)* sin(t.someDouble))FROM   事情t其中t.someValue =:someValue和t.someDouble =:someDouble   AND cos(t.someDouble)* sin(t.someDouble)&gt; 30&#34)

只需添加构造函数,如下所示。

public class Thing {
  // the code you already had

  public Thing(Thing t, double distance){
     this.itemId = t.itemId;
     this.someValue = t.someValue;
     this.distance = distance;
   }
}