package com.github.geequery.springdata.test.repo;
import java.util.Date;
import java.util.List;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.repository.RepositoryDefinition;
import org.springframework.data.repository.query.Param;
import com.github.geequery.springdata.annotation.IgnoreIf;
import com.github.geequery.springdata.annotation.Modifying;
import com.github.geequery.springdata.annotation.ParamIs;
import com.github.geequery.springdata.annotation.Query;
import com.github.geequery.springdata.test.entity.Foo;
/**
* 此处适应Spring-date-JPA中的自定义查询方式 后续考虑增加一个注解可不依赖Spring-data-jpa
* Query换成spring-JPA中的Query。
*
* @author Administrator
*
*/
@RepositoryDefinition(domainClass = Foo.class, idClass = Integer.class)
public interface FooEntityDao {
/**
* @Query(value = "select * from foo u where u.name like ?1", nativeQuery =
* true)
* @param username
* @return
*/
@Query(value = "select * from foo u where u.name like ?1<string$>",nativeQuery=false)
public Foo findByusername(String username);
/**
* @Query("select * from foo u where u.name=:name")
*
* @param name
* @return
*/
@Query(value="select * from foo u where u.name=:name",nativeQuery=false)
public Foo findBysName(@Param("name") String name);
/**
* @Query("select * from foo where name like :name and age=:age")
* @param birthDay
* @param name
* @return
*/
@Query(name = "selectByNameAndBirthDay")
public List<Foo> findBySql(@Param("birth") Date birthDay, @Param("name") String name);
/**
* @Query("select * from foo where name like ?1 and birthday=?2")
* @param name
* @param birthDay
* @return
*/
@Query(name = "selectByNameAndBirthDay2", nativeQuery = true)
public List<Foo> findBySql2(String name, Date birthDay);
/**
* @Query("select * from foo where name like :name and age=:age")
* @param name
* @param birthDay
* @return
*/
@Query(value = "select * from foo where name like :name and age=:age",nativeQuery=false)
public Foo findBySql3(@Param("name") String name, @Param("age") int age);
/**
* @Query("select * from foo where name like :name and age=:age")
* @param birthDay
* @param name
* @return
*/
@Query(value="select * from foo where name like ?2<string$> and age=?1",nativeQuery=false)
public Foo findBySql4(int birthDay, String name);
/**
* @Query("select * from foo where name like :name and age=:age")
* @param birthDay
* @param name
* @param page
* @return
*/
@Query("select * from foo where name like :name and age=:age")
public Page<Foo> findBySql5(@Param("age") @IgnoreIf(ParamIs.Zero) int age, @Param(value = "name") @IgnoreIf(ParamIs.Null) String name, Pageable page);
/**
* @Query("select * from foo where age=?1 and name like ?2<$string$>")
* @param age
* @param name
* @param sort
* @return
*/
@Query(value="select * from foo where age=?1 and name like ?2<$string$>",nativeQuery=false)
public List<Foo> findBySql6(int age, String name, Sort sort);
@Query(value="select * from foo where age=?1 and name like ?2<$string$> order by ?3<sql>"
,nativeQuery=false)
public List<Foo> findBySql62(@IgnoreIf(ParamIs.Zero) int age, @IgnoreIf(ParamIs.Empty) String name, String orderField);
/**
* (value="select * from foo where age=?1 and name like ?2",nativeQuery=true
* )
*
* @param age
* @param name
* @param sort
* @return
*/
@Query(value = "select * from foo where age=?1 and name like ?2<$string$>",nativeQuery=false)
public Page<Foo> findBySql7(int age, @IgnoreIf(ParamIs.Empty) String name, Pageable page);
/**
* insert into foo(remark,name,age,birthday) values
* (:remark,:name,:age,:birthday)
*
* @param name
* @param age
* @param remark
* @param birthDay
*/
@Modifying
@Query(value="insert into foo(remark,name,age,birthday) values (?3, ?1, ?2, ?4)",nativeQuery=false)
public int insertInto(String name, int age, String remark, Date birthDay);
@Modifying
@Query(value="insert into foo(remark,name,age,birthday) values (:remark, :name, :age, :birthday)",nativeQuery=false)
public int insertInto2(@Param("name") String name, @Param("age") int age, @Param("remark") String remark, @Param("birthday") Date birthDay);
/**
* update foo set age=age+1,birthDay=:birth where age=:age and id=:id
*
* @param birthDay
* @param age
* @param id
*/
@Modifying
@Query(value="update foo set age=age+1,birthDay=:birth where age=:age and id=:id",nativeQuery=false)
public int updateFooSetAgeByAgeAndId(@Param("birth") Date birth, @Param("age") int age, @Param("id") int id);
}