【发布时间】:2021-09-27 22:57:24
【问题描述】:
我有三个具有相同列名和类型的表,变化的只是表名。
示例: |表 1 |表 2 |表 3 | | ------ | ------ | -------- | |身份证 |身份证 |身份证 | |姓名 |姓名 |姓名 | |福 |福 |福 | |酒吧 |酒吧 |酒吧 |
我有三个实体,每个表一个。
实体父级:
public class EntityParent {
@Id
@Column(name = "ID")
private Long id;
@Column(name = "NAME")
private String name;
@Column(name = "FOO")
private String foo;
@Column(name = "BAR")
private String bar;
}
实体子代:
@Table(name = "TABLE1")
public class Entity1 extends EntityParent {
}
@Table(name = "TABLE2")
public class Entity2 extends EntityParent {
}
@Table(name = "TABLE3")
public class Entity3 extends EntityParent {
}
我有一个通用存储库,有一些方法:
@NoRepositoryBean
public interface EntityGenericRepository<T extends EntityParent, ID> extends JpaRepository<T, ID> {
List<T> findAllByName(String name);
List<T> findAllByFooAndBar(String foo, String bar);
List<T> findAllByNameOrFoo(String name, String foo);
}
到目前为止一切顺利。
请参阅下面的代码重复,使用方法 findEntityXToDto:
@Repository
public interface Entity1Repository extends EntityGenericRepository<Entity1, Long> {
@Query("SELECT new com.package.MyDTO(e.foo, e.bar) FROM Entity1 e WHERE e.name = :name")
List<MyDTO> findEntity1ToDto(@Param("name") String name);
}
@Repository
public interface Entity2Repository extends EntityGenericRepository<Entity2, Long> {
@Query("SELECT new com.package.MyDTO(e.foo, e.bar) FROM Entity2 e WHERE e.name = :name")
List<MyDTO> findEntity2ToDto(@Param("name") String name);
}
@Repository
public interface Entity3Repository extends EntityGenericRepository<Entity3, Long> {
@Query("SELECT new com.package.MyDTO(e.foo, e.bar) FROM Entity3 e WHERE e.name = :name")
List<MyDTO> findEntity3ToDto(@Param("name") String name);
}
这里有问题。如何创建 SELECT JPQL 泛型? 比如:
SELECT new com.package.MyDTO(t.foo, t.bar) FROM T t WHERE t.name = :name
【问题讨论】:
-
我会继续猜测这是不可能的。最后 JPQL 变成了一个 SQL 查询。 SQL查询需要知道它需要查询什么表。 JPQL 从查询中的实体获取该信息。僵局。我建议使用本地查询 - 这样您就可以将表名作为参数传递。
标签: java jpa spring-data-jpa jpql