标签: jpql

编译查询时出错:抽象模式类型"实体"未知

我正在开发一个带有数据库连接的游戏,我使用JPA来保存我的数据.这是我的游戏实体:

@Entity
@Table(name = "game")
public class Game implements Serializable {
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "game_id")
private int id;

@Column(name = "name")
private String name;

@Column(name = "nbTurns")
private int nbTurns;

@Column(name = "playedOn")
@Temporal(TemporalType.TIMESTAMP)
private Date playedOn;

@ElementCollection(fetch = FetchType.EAGER)
@CollectionTable(name = "game_humans", joinColumns = @JoinColumn(name = "game_id"))
@MapKeyColumn(name = "human_id")
@Column(name = "isDead")
private Map<Human, Boolean> humans;
Run Code Online (Sandbox Code Playgroud)

这是我的人类实体:

@Entity
@Table(name = "human")
public class Human implements Serializable {

private …
Run Code Online (Sandbox Code Playgroud)

java persistence jpa jpql

15
推荐指数
4
解决办法
3万
查看次数

JPQL:在构造函数表达式中接收集合

我正在使用JPQL并希望在Constructor Expression中接收一些常规参数和集合以直接创建DTO对象.但是如果Collection是空的,我总是会收到错误,因为他找不到合适的构造函数:

DTO-Class看起来如下:

public class DTO {
    private long id;
    private String name;
    private Collection<Child> children;

    public DTO (long id, String name, Collection<Child> children){
    this.id = id;
    this.name = name;
    this.children= children;
    }
}
Run Code Online (Sandbox Code Playgroud)

儿童班:

public class Child {
    private String name;
    private int age;
}
Run Code Online (Sandbox Code Playgroud)

现在,Constructor Expression看起来如下:

return (List<DTO>) getEm().createQuery("SELECT DISTINCT NEW de.DTO(p.id, p.name, p.childs) 
                                          FROM Parent p").getResultList();
Run Code Online (Sandbox Code Playgroud)

当前的问题是,如果Collection p.childs为空,它表示它找不到正确的构造函数,它需要(long,String,Child)而不是(long,String,Collection).

您是否有任何解决方案,或者根本无法在构造函数表达式中使用Collection?

哦还有一件事:如果我轻松创建两个构造函数(...,Collection childs AND ...,Child childs)我没有得到任何结果,但也没有错误......在我看来并不是很满意: - /

java constructor expression jpa jpql

14
推荐指数
1
解决办法
5101
查看次数

JPQL 查询 - 休眠:提取的关联不允许带子句

我有这样的 JPA 存储库和 JPQL 查询:

@Query("SELECT c from Campaign c" +
        " left join fetch c.postsList p on p.status = :postStatus" +
        " left join fetch p.platform" +
        " left join fetch c.campaignStatistics stat on stat.updateDate = :updateDate" +
        " where c.id =:id")
Campaign findCampaignWithPosts(
        @Param("id") Long id,
        @Param("postStatus") PostStatus postStatus,
        @Param("updateDate") LocalDate updateDate);
Run Code Online (Sandbox Code Playgroud)

但它不起作用。我得到:

org.hibernate.hql.internal.ast.QuerySyntaxException: with-clause not allowed on fetched associations; use filters
Run Code Online (Sandbox Code Playgroud)

我去研究了有关 JPA 2.1 规范的信息,这就是我发现的:

用于连接的连接条件来自映射的连接列。这意味着 JPQL 用户通常不必知道每个关系是如何连接的。在某些情况下,需要向连接条件附加附加条件,通常是在外部连接的情况下。这可以通过 ON 子句来完成。ON 子句在 JPA 2.1 规范中定义,并且某些 JPA 提供程序可能支持。EclipseLink : …

java hibernate jpa join jpql

14
推荐指数
2
解决办法
7818
查看次数

Spring JPA Projection findAll

是否可以使用"findAll"为JPARepository返回一个Collection/List of Projections?例:

@Entity
public class Login {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "native")
    @GenericGenerator(name = "native", strategy = "native")
    private Integer id;

    private String name;

    private String pass;

    (...)
Run Code Online (Sandbox Code Playgroud)

}

public interface LoginProjection {
    public String getName();
}

@Repository
public interface LoginRepository extends JpaRepository<Login, Long> {
    Login findByName(String name);

    @Query(value = "SELECT name FROM login", nativeQuery = true)
    List<LoginProjection> findAllLoginProjection();
}
Run Code Online (Sandbox Code Playgroud)

使用@Query它的工作原理!但是不可能使用

 List<LoginProjection> findAll();
Run Code Online (Sandbox Code Playgroud)

因为LoginProjection它没有扩展T(登录).

我在想是否有可能为findAll提供一个"别名",就像findAllXYZ一样,它与findAll做同样的事情.使用过滤器也可以,但我不想使用它们:

 List<LoginProjection> findAllByName(String name);
Run Code Online (Sandbox Code Playgroud)

我的主要目标是这样的:

@Repository
public interface LoginRepository extends JpaRepository<Login, Long> { …
Run Code Online (Sandbox Code Playgroud)

java spring jpql spring-data-jpa

14
推荐指数
2
解决办法
4449
查看次数

这是可能的:结果中的list属性的JPA/Hibernate查询?

在hibernate中我想运行这个JPQL/HQL查询:

select new org.test.userDTO( u.id, u.name, u.securityRoles)
FROM User u
WHERE u.name = :name
Run Code Online (Sandbox Code Playgroud)

userDTO类:

public class UserDTO {
   private Integer id;
   private String name;
   private List<SecurityRole> securityRoles;

   public UserDTO(Integer id, String name, List<SecurityRole> securityRoles) {
     this.id = id;
     this.name = name;
     this.securityRoles = securityRoles;
   }

   ...getters and setters...
}
Run Code Online (Sandbox Code Playgroud)

用户实体:

@Entity
public class User {

  @id
  private Integer id;

  private String name;

  @ManyToMany
  @JoinTable(name = "user_has_role",
      joinColumns = { @JoinColumn(name = "user_id") },
      inverseJoinColumns = {@JoinColumn(name = "security_role_id") } …
Run Code Online (Sandbox Code Playgroud)

hibernate jpa hql jpql jpa-2.0

13
推荐指数
1
解决办法
1万
查看次数

JPQL查询---怎么用'是null'

我在JPQL中使用以下查询来查询其地址列为空的人.

列出rl = em.createQuery("从o中选择o为o,其中o.address为空").setFirstResult(0).setMaxResults(50).getResultList(); ...

这行代码总是返回一个空列表,显然该表确实具有与条件匹配的条目.

class Person {地址; 字符串名称; ...} class Address {String name; ...}

谁知道这个jpql语句有什么问题?提前致谢.

jpql

13
推荐指数
1
解决办法
4万
查看次数

带有枚举值的jpql IN查询

我正在使用JPQL查询来检查列表是否包含指定的枚举值.如果枚举值是要检查的单个元素,那么它非常简单.

在查询表达式中,

query = "... where s.status = :status";
Run Code Online (Sandbox Code Playgroud)

然后设置参数

query.setParameter("status", statusValue);
Run Code Online (Sandbox Code Playgroud)

但我想检查下面的内容

query = "... where s.status IN (:statusList)";
Run Code Online (Sandbox Code Playgroud)

where statusList是一串数字(例如"0,1,2",表示状态值列表)

但我找不到解决方案.我也s.status.ordinal() IN (statusList)查询过但没有运气.

我正在使用JPA实现:EclipseLink(JPA 2.0)

我的实体的实际名称是 SType

public enum SType
{
    REQUISITION,
    PURCHASE,   
    FINISHED,   
    // others
    RETURN;
}
Run Code Online (Sandbox Code Playgroud)

查询:

String querySt = "select s.slipType.slipNameSt,s.slipNumberSt, s.idNr from Slip s 
where s.slipType.sType IN (:enumTypeListt)";

em.createQuery(querySt).setParameter("enumTypeList", EnumSet.of(SType.REQUISITION, 
                                                                SType.PURCHASE));
Run Code Online (Sandbox Code Playgroud)

java enums jpql

13
推荐指数
1
解决办法
1万
查看次数

如何在JPA中查询"超过三分钟"?

有没有办法在JPA查询中引用当前时间的日期范围条件(跨数据库兼容)?

我可以

SELECT m FROM Mail m WHERE m.sentAt < :date
Run Code Online (Sandbox Code Playgroud)

但我想在不必绑定参数的情况下这样做(这样可以将其配置为命名查询存储库的一部分,并且日期计算逻辑不必输入调用代码).

因此,:date我不需要"currentTime减去3分钟"作为硬代码字面值.

datetime jpa jpql

13
推荐指数
2
解决办法
2万
查看次数

hibernate查询列表:空或null?

如果我有使用Hibernate的方法,像这样:

public <T> T typedQuery(Query q, Class<T> type) {
    List<T> results = q.list();

    //result will be null or empty List ?
}
Run Code Online (Sandbox Code Playgroud)

如果查询不会从表中获取任何记录,那么result会是null空列表吗?

java null hibernate list jpql

13
推荐指数
1
解决办法
1万
查看次数

如何在JPA 2.0中创建'类似'的查询实例?

假设我们有一个抽象的@Entity Animal,以及几个扩展Animal的实体类,包括Dog,Cat,Monkey和Bat.

如何根据扩展实体的类过滤结果?

示例:有复选框,用户可以在其中选择要检索的实体.

[ ] Dog
[X] Cat
[X] Monkey
[ ] Bat
Run Code Online (Sandbox Code Playgroud)

现在我想检索具有在Animal类中定义的(命名)查询的实体.我可以在查询中放入什么样的查询参数,以便只返回Cat和Monkey对象?

java jpa jpql jpa-2.0

12
推荐指数
1
解决办法
1万
查看次数