小林子你真猛! 2019-03-27 19:31 采纳率: 0%
浏览 3681

jpa @Query中获得方法的实体参数的各个属性

错误的代码片段:

@Query(value = "select g from Game g where g.delFlag=0 and "
        + "if(:game.name !='',g.name= :game.name,1=1)")
Collection<GameView> findTest(@Param("game") Game game);

我想在@Query的查询语句里直接取出Game里的name做判断条件,网上看的例子是:

@Query("select u from User u where u.firstname = :#{#customer.firstname}")
List<User> findUsersByCustomersFirstname(@Param("customer") Customer customer);

照着例子写好报错:

Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected AST node: ( near line 1, column 74 [select g from org.SpringLearn.entity.game.Game g where g.delFlag=0 and if(:__$synthetic$__1 !='',g.name= :__$synthetic$__2,1=1)]
    at org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:74) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
    at org.hibernate.hql.internal.ast.ErrorTracker.throwQueryException(ErrorTracker.java:93) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:277) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:191) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:143) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:119) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:80) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
    at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:153) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
    at org.hibernate.internal.AbstractSharedSessionContract.getQueryPlan(AbstractSharedSessionContract.java:595) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
    at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:704) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
    ... 176 common frames omitted

求大神解答

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-08 14:17
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    你想要在JPA查询语句中获取某个实体类(例如:Game)中的属性(例如:name),可以通过以下方式实现:

    首先,在你的实体类(例如:Game)上添加一个泛型注解(@Entity),以表示这是一个持久化对象。

    然后,使用@Query注解来定义查询。你可以使用Java类型参数来指定你需要查询的字段名称,例如:@Query(value="SELECT g FROM Game g WHERE g.delFlag = 0 AND g.name = :name", nativeQuery=true)

    这样,当执行这个查询时,Hibernate会根据传入的参数(即name值)从Game表中选择相应的记录,并返回结果集。

    注意,这里的@Query@Entity注解组合在一起,可以提高性能,因为它们有助于减少数据库访问次数,特别是当你多次调用同一个@Query时。此外,@Entity还告诉Spring框架将此类作为持久化对象进行管理。

    以下是完整的示例代码:

    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    
    @Entity
    public class Game {
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
    
        // 其他属性...
        
        public String getName() {
            return name;
        }
    
        // getters 和 setters...
    }
    
    // 假设我们有一个名为Customer的实体类
    @Entity
    public class Customer {
    
        private String firstname;
    
        // 其他属性...
    
        public Customer(String firstname) {
            this.firstname = firstname;
        }
    }
    

    在这个示例中,我们在Game类上添加了@Entity注解,并设置了@Id注解,这表示它是一个持久化对象。同时,我们为id字段设置了一个自增的主键。然后,我们定义了一个名为getName()的方法,用于返回游戏的名字。

    现在,我们可以创建一个Customer实例并设置它的名字,然后使用以下SQL查询来查找所有名字为"John Doe"的游戏:

    SELECT g.id, g.name FROM Game g WHERE g.name = 'John Doe'
    

    这样,当执行这个查询时,Hibernate就会根据传入的参数(即'John Doe')从Game表中选择相应的记录,并返回结果集。

    评论

报告相同问题?